2014-11-24 7 views
7

Ho bisogno di mappare un oggetto array JSON con la classe POJO java. Ho scritto il codice come questo:com.fasterxml.jackson.databind.JsonMappingException: nessun contenuto da mappare a causa della fine dell'input

// 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)); 
} 

Il blocco di cui sopra mi sta dando seguente errore:

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) 

Qualsiasi aiuto sarebbe apprezzato. Grazie.

risposta

1

Dopo aver letto la risposta, i dati della risposta vengono consumati. Se il codice è in intercettore si potrebbe provare la creazione di nuovo di risposta e di ritorno, di seguito:

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; 

Qui la risposta è creato di nuovo e restituito.

Fammi sapere qualsiasi aggiornamento.

1

L'uso di inputStream e bufferedReader sembra sbagliato. Se hai creato un JsonParser per l'input, probabilmente è meglio continuare a utilizzarlo per la mappatura dell'oggetto. Potrebbe esserci un problema con il lettore bufferizzato che legge avidamente tutto il contenuto dallo stream, senza lasciare nulla da leggere per il parser JSON.

Sembra inoltre che manchi una sezione del codice, nella condizione if.

Qualcosa di simile a questo:

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

Note supplementari:

  • E 'sconsigliato per avvolgere i flussi di buffer/decodifica (InputStreamReader) prima di passare a Jackson come parser di Jackson hanno pesantemente ottimizzato questo processo già
    • In realtà, il wrapping di InputStreamReader in BufferedReader è praticamente sempre ridondante come In putStreamReader fa contenuto del buffer
  • TypeFactory e JsonFactory può sia essere ottenuto da un'istanza ObjectMapper
  • Non c'è bisogno di inizializzare proprietari di un elenco vuoto che otterranno override anyway-- dichiararla senza inizializzazione e utilizzare un else per impostare il valore predefinito solo quando necessario
0

Immagino che dovresti usare OutputStreamWriter per deserializzare la tua risposta.

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

Problemi correlati