使用 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);
}
我有这个 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
您可以将 Json 读取为 Map
无论如何,有一个基于 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);
}