使用 Jackson,如何从有趣的 json 中获取对象列表?

Using Jackson, how can you get a list of objects from an interesting json?

我有这个 json,我需要使用 Jackson 获取货币对象列表(对象本身有一个货币名称字段 - “USD”、“type”和“show”)作为结果.怎样才能简单明了?

欢迎任何帮助

{
    ...
    "result": "OK",
    "currency": {
        "currencies": {
            "LB": {
                "type": "A",
                "setting": {
                    "show": true,
                },
                "access" : true
            },
            "USD": {
                "type": "B",
                "setting": {
                    "show": true,
                },
                "access" : true
            },
            "RUB": {
                "type": "A",
                "setting": {
                    "show": true,
                },
                "access" : true
            },
          ....
          // and more.. 
         },
       ...
    }
 }
"currencies": {
        "LB": {
            "type": "A",
            "setting": {
                "show": true,
            },
            "access" : true
        },
        "USD": {
            "type": "B",
            "setting": {
                "show": true,
            },
            "access" : true
        },
        "RUB": {
            "type": "A",
            "setting": {
                "show": true,
            },
            "access" : true
        },
      ....
      // and more.. 
     },
   ...

这看起来像地图,而不是列表。这对你有帮助吗?因此,您需要创建 Currency class 并让 jackson 将此结构解析为 Map。请注意,货币不会包含标识符(如“USD”),只有它们在地图中键入时才会包含。

您可以将 Json 读取为 Map。一旦你有了地图,你就可以遍历你的地图并构建你的列表。 如果您想从 Json 反序列化(读取)到您的自定义对象列表,您需要将 Json 重组为 Json 列表而不是 Json 对象。然后你可以直接将你的 Json 读入一个列表。

无论如何,有一个基于 Jackson 库的开源库确实简化了 reading/writing 对象 from/to Json。如果你有一个 json 字符串,你所要做的就是:

Map<String, Object> map = JsonUtils.readObjectFromJsonString(jsonString, Map.class);

虽然它会抛出 IOException,因此您需要处理它。这是Javadoc. The library is called MgntUtils and could be found as Maven artifact and on the Github(包括javadoc和源代码)

我能够将对象保存添加到列表中,但是以一种相当不方便的方式,在我看来...

ArrayList<Dto> currencyObjectList = new ArrayList<Dto>();
CurrencyStaticDto obj = null;

JsonNode currencies = mapper.readTree(response.getBody()).get("currencies");
Iterator<Map.Entry<String, JsonNode>> fields = currencies.fields();

while(fields.hasNext()) {
    Map.Entry<String, JsonNode> field = fields.next();
    String fieldName = field.getKey();
    JsonNode fieldValue = field.getValue();
    obj = mapper.readValue(fieldValue.toString(),CurrencyStaticDto.class);
    obj.setCurrency(fieldName);

    currencyObjectList.add(obj);
}