2015-10-26 13 views
1

我有一个JSON(来自流)。数据非常庞大。所以我不想反序列化成一个具体的Java对象。所以我想用Jackson解析器。将使用杰克逊输入流将所有内容带入内存

JsonFactory factory = new JsonFactory(); 
JsonParser parser = factory.createJsonParser(stream); 

我的目标是让(从对象的特定属性)从流的特定部分

{ 
    "array": [], 
    "map": {}, 
    "bool": "true", 
    "string": "abcd" 
} 

例如:我想只有在

地图或阵列等

但是我的问题是,当我使用inputstream并解析它(获取流的特定部分)时,它(整个JSON)会一次被带入内存吗?

这(解析)方式和反序列化成一个对象(然后从对象中获取特定成员)之间的区别是什么?

回答

0

在Jackson支持的3种主要处理模式中,流处理(也称为增量处理)是处理JSON内容的最有效方式。它具有最低的内存和处理开销,往往可以匹配的在Java平台上提供很多的二进制数据格式的性能(请参阅“性能比较”下面的链接)

根据fasterxml文档(http://wiki.fasterxml.com/JacksonStreamingApi),该JsonParser不读取内存中的所有流。它只在每次需要时才读取流。

+0

如果我使用'JsonNode rootNode = mapper.readValue(src,JsonNode.class);''src'是流,它会带来整个JSON到内存? – Ashwin

+0

是的。因为杰克逊需要读取整个json来完成给定类的映射。 – Magus

+0

因此,我需要直接访问一个元素('array'或'map'),是否需要使用流(而不是树模型)? (我不想将整个JSON带入内存) – Ashwin