Java 使用Jackson 2.2处理JSON
我使用Jackson 2.2将一个非常大的JSON字符串读入Java对象。使用Java 使用Jackson 2.2处理JSON,java,json,jackson,Java,Json,Jackson,我使用Jackson 2.2将一个非常大的JSON字符串读入Java对象。使用ObjectMapper,我将所有内容读入内存,并将JSON字符串转换为object。这一切都发生在内存中,因此整个JSON字符串被加载到内存中并转换为对象 如果有一种更节省内存的方法?i、 不将整个JSON字符串加载到内存中,我应该仍然能够加载对象 是的,您通常使用所谓的“流”API来迭代JSON令牌;一旦定位到您想要的值的第一个标记(JSON对象的START_对象)上,就使用数据绑定API,将读取器/解析器传递给它
ObjectMapper
,我将所有内容读入内存,并将JSON字符串转换为object。这一切都发生在内存中,因此整个JSON字符串被加载到内存中并转换为对象
如果有一种更节省内存的方法?i、 不将整个JSON字符串加载到内存中,我应该仍然能够加载对象 是的,您通常使用所谓的“流”API来迭代JSON令牌;一旦定位到您想要的值的第一个标记(JSON对象的START_对象)上,就使用数据绑定API,将读取器/解析器传递给它使用。这方面的细节取决于图书馆。我知道至少以下方面支持这种操作模式:
- 杰克逊
- 格森
- 根森
{ "comment" : "...",
"values" : [
{ ... value object 1 ... },
{ ... value object 2. ... }
]
}
你可以做:
ObjectMapper mapper = new ObjectMapper();
JsonParser jp = mapper.getFactory().createJsonParser(jsonInput);
jp.nextToken(); // will return START_OBJECT, may want to verify
while (jp.nextValue() != null) { // 'nextValue' skips FIELD_NAME token, if any
String fieldName = jp.getCurrentName();
if ("values".equals(fieldName)) {
// yes, should now point to START_ARRAY
while (jp.nextToken() == JsonToken.START_OBJECT) {
ValueObject v = mapper.readValue(jp, ValueObject.class);
// process individual value in whatever way to you want to...
}
} else if ("comment".equals(fieldName)) {
// handle comment?
} // may use another else to catch unknown fields, if any
}
jp.close();
这应该允许您一次只绑定一个对象。使用流式API,我必须解析整个JSON字符串并生成对象。JSON中已经通过streamingHow large执行的任何其他默认实现“非常大”?700MB是包含JSON字符串的文件大小