2014-11-24 38 views
7

我需要使用java POJO類映射JSON數組對象。 我寫了這樣的代碼:com.fasterxml.jackson.databind.JsonMappingException:由於輸入結束而無法映射

// execute the client with get method 
InputStream inputStream = getMethod.getResponseBodyAsStream(); 

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 

ObjectMapper objectMapper = new ObjectMapper(); 

JsonFactory jsonFactory = new JsonFactory(); 
List<OwnerDetail> owners = new ArrayList<>(); 
JsonParser jsonParser = jsonFactory.createJsonParser(inputStream); 

if (jsonParser.nextToken() != null && jsonParser.) 
{ // end-of-input 
    owners = objectMapper.readValue(bufferedReader, TypeFactory.defaultInstance().constructCollectionType(List.class, OwnerDetail.class)); 
} 

以上塊是給我以下錯誤:

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input 
at [Source: [email protected]; line: 1, column: 1] 
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) 
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3029) 
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2971) 
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2128) 

任何幫助,將不勝感激。謝謝。

回答

1

讀取響應後,響應中的數據被消耗。 如果你的代碼是在攔截器,你可以再次嘗試建立響應和如下返回:

Request request = chain.request(); 
    Response originalResponse = chain.proceed(request); 
    final ResponseBody original = originalResponse.body(); 
    // if(request.url().toString().equalsIgnoreCase(string)){ 
    if (originalResponse.code() == HttpURLConnection.HTTP_OK) { 
     try { 
      String response = originalResponse.body().string(); 
      JSONObject mainObject = new JSONObject(response); 

      // your mapping - manipulation code here. 
      originalResponse = originalResponse.newBuilder() 
          .header("Cache-Control", "max-age=60") 
          .body(ResponseBody.create(original.contentType(), 
            mainObject.toString().getBytes())) 
          .build(); 

     } catch (JSONException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return originalResponse; 

這裏響應再次創建並返回。

請讓我知道任何更新。

1

使用inputStream bufferedReader似乎是錯誤的。如果您爲輸入創建了JsonParser,則最好繼續將其用於對象映射。緩衝式閱讀器可能會急於讀取流中的所有內容,從而導致JSON解析器無法讀取任何內容。

看起來您的代碼在if的條件中缺少了一個部分。

事情是這樣的:

if (parser.isExpectedStartArrayToken()) { 
     owners = mapper.readValue(parser, mapper.getTypeFactory().constructCollectionType(List.class, OwnerDetail.class)); 
    } 

附加說明:

  • 我們建議傳遞給傑克遜作爲傑克遜的解析器之前來包裝緩衝/解碼(InputStreamReader的)流已高度優化這過程已經
    • 實際上,在BufferedReader中包裝InputStreamReader實際上總是冗餘的,因爲In putStreamReader做緩衝內容
  • TypeFactory和JsonFactory都可以從ObjectMapper實例
  • 無需初始化業主一個空列表,將讓重寫anyway--聲明它沒有初始化,並使用else設置獲得默認只在必要時
0

我想你應該使用OutputStreamWriter來反序列化你的迴應。

OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream()); wr.write(auth.toString());
wr.flush();

相關問題