使用Jackson解析复杂JSON对象的列表

时间:2015-06-19 21:27:02

标签: java json 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似乎很可能会杀死它。想法?

2 个答案:

答案 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}
}