Java 使用Jackson 2.2处理JSON

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,将读取器/解析器传递给它

我使用Jackson 2.2将一个非常大的JSON字符串读入Java对象。使用
ObjectMapper
,我将所有内容读入内存,并将JSON字符串转换为object。这一切都发生在内存中,因此整个JSON字符串被加载到内存中并转换为对象


如果有一种更节省内存的方法?i、 不将整个JSON字符串加载到内存中,我应该仍然能够加载对象

是的,您通常使用所谓的“流”API来迭代JSON令牌;一旦定位到您想要的值的第一个标记(JSON对象的START_对象)上,就使用数据绑定API,将读取器/解析器传递给它使用。这方面的细节取决于图书馆。我知道至少以下方面支持这种操作模式:

  • 杰克逊
  • 格森
  • 根森
对于Jackson,讨论了基本的流式API用法(例如);但有一件事没有说明,那就是一旦定位到正确的位置,如何绑定对象。 假设JSON类似:

{ "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字符串的文件大小