[英]Parse list of complex JSON objects using Jackson
我有一個類似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似乎可以殺死它。 有想法嗎?
如果您能夠使用傑克遜(Jackson)注釋,並且不太在乎性能,則可以執行以下討厭的小技巧:
// 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));
}
}
但是干凈的方法是編寫MyObjDeserializer
建議的MyObjDeserializer。
注意"objs"
數組中的那些前導逗號。
首先,您需要一個用於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}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.