2015-05-15 53 views
1

比方說,我有像一些JSON響應:讀JSON令牌(字節[])作爲流

{ 
    byteProp: [1, 3, 2, ... some very large byte content] 
} 

我想取byteProp如流。我已經開始與JacksonStreamingApi並認爲我應該創建解析器,如:

JsonFactory jfactory = new JsonFactory(); 
JsonParser jParser = jfactory.createJsonParser(myJsonStream); 

卜的問題是,我沒有看到機會向讓我byteProp如流,只有這樣,才能得到這個屬性是使用某事像(假設我們是在正確的令牌)

jParser.getBinaryValue() 

仍然將獲取所有byteProp內容到內存中,這是我想避免的情況。

有什麼辦法可以讀取單個json屬性作爲流?

回答

2

像這樣的事情應該工作,提高您認爲合適的:

ByteArrayOutputStream os = new ByteArrayOutputStream(); 

JsonFactory jfactory = new JsonFactory(); 
JsonParser jParser = jfactory.createJsonParser(new FileInputStream(new File("data/json.json"))); 

if (jParser.nextToken() != JsonToken.START_OBJECT) { 
    return; 
} 
while (jParser.nextToken() != JsonToken.END_OBJECT) { 
    String fieldName = jParser.getCurrentName(); 

    jParser.nextToken(); 
    if (fieldName.equals("byteProp")) { 
     byte[] bytes = new byte[1024]; 
     int read = 0; 
     while (jParser.nextToken() != JsonToken.END_ARRAY) { 
      if (read >= bytes.length) { 
       os.write(bytes, 0, read); 
       os.flush(); 
       bytes = new byte[1024]; 
       read = 0; 
      } 

      bytes[read++] = jParser.getByteValue(); 
     } 
     if (read >= 0) { 
      os.write(bytes, 0, read); 
      os.flush(); 
     } 
    } 
} 

System.out.println(new String(os.toByteArray())); 

的東西更換ByteArrayOutputStreamFileOutputStream,根據您的需要。