2015-10-26 14 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