我有一个包含多个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对象的数据,如我所愿。
有什么想法吗?
谢谢!
答案 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)
个对象。