我有一个JSON对象列表,如:
[
{
"id": "A",
"objs": [
{ "obj1": 1 },
{ "obj2": 0 },
]
},
{
"id": "A",
"objs": [
{ "obj1": 1 },
{ "obj2": 0 },
]
}
]
并希望将它们加载到MyObj列表中:
class MyObj {
private final String id;
private final HashMap<String, Integer> objs;
// Constructors, etc. here...
}
ArrayList<MyObj> list;
使用Jackson ObjectMapper或其他绑定是否有任何智能方法可以做到这一点;即,最少的样板代码?没有HashMap,这将是一个简单的问题:
list = mapper.readValue(file, new TypeReference<ArrayList<MyOBJ>>() {});
但是HashMap似乎很可能会杀死它。想法?
答案 0 :(得分:0)
如果你能够使用杰克逊注释,并且不太关心性能,你可以做这个令人讨厌的小技巧:
// Put this in the MyObj class
@JsonSetter(value="objs")
public void setObjs(HashMap<String, Integer>[] units) {
objs = new HashMap<String, Integer>();
for (HashMap<String, Integer> unit : units) {
for (String key : unit.keySet())
objs.put(key, unit.get(key));
}
}
但是干净的方式是按照@Sotirios的建议写一个MyObjDeserializer
。
注意"objs"
数组中的那些主要逗号。
答案 1 :(得分:0)
首先,您需要一个JSON的模型类。然后你应该编写自己的解析器来读取数据到数组(Map,List等)。杰克逊。
我旧项目的一个小例子。
模特课:
package ru.model;
import javax.persistence.*;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class Entry implements Serializable {
private static final long serialVersionID = 8201337883209943936L;
private Integer primary_id;
private Integer id;
private String description;
private Integer votes;
private String author;
private Date date;
private String gifURL;
private String previewURL;
private String embedId;
private String type;
// getters and setters
}
解析器示例:
public static List<Entry> getAllEntries(String jsonString) {
List<Entry> entries = new ArrayList<Entry>();
try {
if (jsonString.length() == 0) {
throw new Exception("Empty json!");
}
} catch (Exception e) {
e.printStackTrace();
}
ObjectMapper objectMapper = new ObjectMapper();
try {
JsonNode rootNode = objectMapper.readTree(jsonString);
JsonNode resultNode = rootNode.findPath("result"); // choose concrete element in JSON array
if (resultNode.size() > 0) {
for (int i = 0; i < resultNode.size(); i++) {
entries.add(objectMapper.readValue(resultNode.get(i).toString(), Entry.class));
}
}
} catch (IOException e) {
e.printStackTrace();
}
return entries;
}
JSON示例:
{"result":
[
{"id":94,
"description":"description111",
"votes":1,
"author":"sashvd",
"date":"Mar 15, 2013 4:09:03 PM",
"gifURL":"http://-..",
"previewURL":"http://.."}
],
"totalCount":88}
}