2011-02-10 23 views
1

我嘗試將應用程序連接到提供我要麼喜歡獲取或者anarray列表或類

[{"descr":"my description","id":"123"},...] 

或在錯誤的東西像

{"error":{"code":123,"message":"my message"}} 

是案件的陣列外部服務有一種方法可以將其定義爲單個類,或者通過哪個對象來識別流?


更新1:我已經測試了幾個版本,通過在循環中計算100次並計算平均執行時間。在所有不同的版本中,我使用過傑克遜。


這一個是性能的基準。它不符合業務需求,因爲代碼不區分數組和對象。

fcPhotos = mJsonToObjectMapper.readValue(mFcHttpHelper.doGet(urlString), FcPhotos.class); 

照片:使用平均值100執行。持續時間:923ms


使用解析器會使性能降低大約最小。 50%

JsonParser jsonParser = mJsonFactory.createJsonParser(mFcHttpHelper.doGet(urlString)); 

if (jsonParser.nextToken() == JsonToken.START_ARRAY) { 
    fcPhotos = mJsonToObjectMapper.readValue(jsonParser, FcPhotos.class); 
} 

照片:使用平均值100執行。持續時間:1585ms


轉換InputStream的成String,並保持objectMapper.readValue溶液中通入:

jsonString = inputStreamToString(urlString); 
fcPhotos = mJsonToObjectMapper.readValue(jsonString, FcPhotos.class); 

private final String inputStreamToString(final String urlString) throws UnsupportedEncodingException, IOException { 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(mFcHttpHelper.doGet(urlString), "UTF8"), 8192); 
    StringBuilder stringBuilder = new StringBuilder(); 
    String line = null; 

    while ((line = bufferedReader.readLine()) != null) { 
     stringBuilder.append(line + "\n"); 
    } 

    bufferedReader.close(); 
    return stringBuilder.toString(); 
} 

照片:100個執行與魅力。持續時間:更新的1191ms


端1


回答

1

一種可能性是使用JsonParser看什麼是第一令牌(JsonToken.START_ARRAY或JsonToken.START_OBJECT),然後執行數據綁定。 ObjectMapper可以讓JsonParser指向第一個事件,或者尚未移動到第一個事件。在處理一系列根級JSON值時(例如map/reduce樣式流或使用JSON時記錄日誌條目),JsonParser/ObjectMapper的組合也不錯。另一種方法是首先綁定到樹模型(JsonNode; ObjectMapper.readTree());查看節點是否是ObjectNode或ArrayNode,然後使用ObjectMapper.convertValue(rootNode,desiredClass)。這樣做的好處是,如果沒有數組和對象的區別,您還可以檢查樹的屬性。

+0

Thx StaxMan。奇蹟般有效。代碼現在看起來像:\t \t \t JsonFactory f = new JsonFactory(); \t \t \t JsonParser jp = f.createJsonParser(photosInput); \t \t \t \t \t \t \t最終JsonToken的nextToken = jp.nextToken(); \t \t \t if(nextToken == JsonToken。START_ARRAY){ \t \t \t \t anArray = mJsonToObjectMapper.readValue(jp,AnArray.class); 元件「); \t \t \t}否則如果(的nextToken == JsonToken.START_OBJECT){ \t \t \t \t anError = mJsonToObjectMapper.readValue(JP,AnError.class); \t \t \t \t Log.w(TAG, 「出現錯誤」 + error.code + 「:」 +返回Error.message); \t \t \t}否則{ \t \t \t \t Log.w(TAG 「UNKNOW結果」); \t \t \t} – lichtzeichenanlage 2011-02-10 10:31:03

相關問題