首页 > 解决方案 > Java 读取 JSON 属性名称而不解析为类

问题描述

我有个问题。

之前,我将多个对象从 1 个 JSON 解析为ArrayList<Object>. 这很好用,但现在我需要做一些不同的事情,我不知道该怎么做。我有以下 JSON:

{
   "Market":"USDT",
   "Coin":"BTC",
   "Candles":{
      "USDT":{
         "BTC":{
            "3h":[
               {
                  "Close":"used"
               }
            ],
            "1h":[
               {
                  "EMA20":"used",
                  "EMA200":"used"
               }
            ],
            "5m":[
               {
                  "EMA5":"used",
                  "EMA20":"used"
               },
               {
                  "EMA5":"used",
                  "EMA20":"used"
               }
            ]
         }
      }
   }
}

从这个 JSON 我想得到一个ArrayList<String>只有值:“3h”、“1h”、“5m”。数组中的值对我来说无关紧要,我只需要这 3 个句点。这是我用于将某些内容解析为类的 json 解析器:

public ArrayList<Agent> parseJsonToList(String StrJSON) {

    Gson gson = new GsonBuilder().registerTypeAdapter(LocalDateTime.class, (JsonDeserializer<LocalDateTime>) (json, type, jsonDeserializationContext) -> {
        try{
            return LocalDateTime.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        } catch (DateTimeParseException e){
            return LocalDateTime.parse(json.getAsJsonPrimitive().getAsString(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"));
        }
    }).create();

    Type listType = new TypeToken<ArrayList<Agent>>() {}.getType();

    return gson.fromJson(StrJSON, listType);

}

现在如何在不创建类(如果可能)的情况下从我的新 JSON 中获取这 3 个值?

标签: javajson

解决方案


您可以将这段丑陋的代码用于您的目的,但这段代码只是为了展示如何实现这一点,我不建议在生产中使用这段代码:

private List<String> extractPeriods(String jsonString) {
    Gson gson = new Gson();
    Map map = gson.fromJson(jsonString, Map.class);

    Map candlesMap = (Map) map.get("Candles");
    if (Objects.isNull(candlesMap))
        return null;
    Map usdtMap = (Map) candlesMap.get("USDT");
    if (Objects.isNull(usdtMap))
        return null;
    Map btcMap = (Map) usdtMap.get("BTC");
    if (Objects.isNull(btcMap))
        return null;
    return new ArrayList<>(btcMap.keySet());
}

当然,您也可以编写正则表达式来搜索所有这些值。
或者您可以只创建部分对象。例如,您可以为根、蜡烛、USDT 和 BTC 字段创建对象,只需使用 Map 类型。


推荐阅读