使用Jackson阅读单个JSON事件

时间:2011-05-02 02:45:00

标签: java json jackson

我有一个包含多个JSON对象的文件,每个对象可能包含其他对象和数组。

我想将这个,最好是使用Jackson库,反序列化为一个维持顶级对象分离的数据结构,例如:一个数组或一个Java HashMap<String, String>对象列表,其中每个HashMap将包含文件中单个顶级JSON对象的数据。

从我所看到的,你无法从杰克逊那里得到HashMap<String, String>,所以我必须忍受HashMap<String, Object>

List<HashMap<String,Object>> values = new ObjectMapper().readValue(new BufferedReader(new FileReader(path)), new TypeReference<List<HashMap<String, Object>>>() {});

上面的反序列化按预期工作,但是我得到了所有文件数据和一个JSON对象的数据,如我所愿。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

经过相当多的努力,这是一个似乎有效的简单方法:

Reader inputReader = new BufferedReader(new FileReader(filename));

int readEvents = 0;

JsonFactory factory = new JsonFactory();

JsonParser parser = factory.createJsonParser(inputReader);

JsonToken token = null;
ObjectMapper mapper = new ObjectMapper();
HashMap<String,Object> attributes = null;
ArrayList<Map<String,Object>> matchedEvents = new ArrayList<Map<String,Object>>();

try
{
    while ((token=parser.nextToken()) != null)
    {
        if (token == JsonToken.START_OBJECT)
        {
            readEvents++;
            attributes = mapper.readValue(parser,
                     new TypeReference<HashMap<String, Object>>() {});
            if (attributes != null)
            {
                matchedEvents.add(attributes);
            }
        }
    }
}
catch (Exception e)
{
    e.printStackTrace();
}

System.out.println("Read " + readEvents + " events");

上面HashMap<String, Object>中放置的每个ArrayList对象都对应一个(顶级)JSON事件。

readValue()方法显然不会返回Map(String, String)个对象。