2014-11-24 1 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

입력 버퍼 bufferedReader를 모두 사용하는 것은 잘못된 것처럼 보입니다. 입력을 위해 JsonParser를 만들었다면 객체 매핑을 위해 JsonParser를 계속 사용하는 것이 가장 좋습니다. 스트림에서 모든 컨텐트를 열심히 읽는 버퍼링 된 판독기에 문제가있을 수 있습니다. JSON 파서가 읽지 않아도됩니다.

if 조건에서도 코드에서 누락 된 부분이있는 것으로 보입니다. 이 같은

뭔가 :

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

추가 사항 : 잭슨의 파서로 잭슨에 전달하기 전에 버퍼링/디코딩 (InputStreamReader)의 스트림을 포장을 을하지 권장

  • 무겁게이 최적화 된 process already already
    • 사실, BufferedReader에 InputStreamReader를 래핑하는 것은 사실상 항상 중복됩니다. putStreamReader 버퍼 내용을
  • TypeFactory을 수행하고 JsonFactory는 둘 모두 ObjectMapper 인스턴스
  • 초기화없이 선언 어쨌든에 재정의 얻을 것이다 빈 목록 소유자를 초기화하고 설정하는 else을 사용할 필요가 없습니다에서 얻을 수 있습니다 필요한 경우에만 기본값을 사용하십시오.
0

응답을 역 직렬화하려면 OutputStreamWriter을 사용해야합니다.

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

관련 문제