Java com.fasterxml.jackson.databind.JsonMappingException:由于输入结束,没有要映射的内容

Java com.fasterxml.jackson.databind.JsonMappingException:由于输入结束,没有要映射的内容,java,json,jackson,Java,Json,Jackson,我需要用JavaPOJO类映射一个JSON数组对象。 我这样写代码: // execute the client with get method InputStream inputStream = getMethod.getResponseBodyAsStream(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); ObjectMapper objectMapp

我需要用JavaPOJO类映射一个JSON数组对象。 我这样写代码:

// 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));
}
    if (parser.isExpectedStartArrayToken()) {
        owners = mapper.readValue(parser, mapper.getTypeFactory().constructCollectionType(List.class, OwnerDetail.class));
    }

任何帮助都将不胜感激。谢谢。

读取响应后,将使用响应中的数据。 如果您的代码在拦截器中,您可以再次尝试创建响应并返回如下所示:

    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;
这里再次创建并返回响应


请务必让我知道任何更新。

inputStream和bufferedReader的使用似乎都是错误的。如果已经为输入创建了JsonParser,那么最好继续将其用于对象映射。缓冲读取器急切地从流中读取所有内容可能会出现问题,而JSON解析器无法读取任何内容

if
条件下,代码中似乎还缺少一个部分

大概是这样的:

// 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));
}
    if (parser.isExpectedStartArrayToken()) {
        owners = mapper.readValue(parser, mapper.getTypeFactory().constructCollectionType(List.class, OwnerDetail.class));
    }
附加说明:

  • 在传递给Jackson之前,建议不要在缓冲/解码(InputStreamReader)中包装流,因为Jackson的解析器已经对这个过程进行了大量优化
    • 实际上,在BufferedReader中包装InputStreamReader实际上总是多余的,因为InputStreamReader会缓冲内容
  • TypeFactory和JsonFactory都可以从ObjectMapper实例获得
  • 无需将所有者初始化为一个空列表,该列表无论如何都会被覆盖——在不初始化的情况下声明它,并仅在必要时使用
    else
    设置默认值

我想您应该使用
OutputStreamWriter
来反序列化您的响应

OutputStreamWriter wr=新的OutputStreamWriter(con.getOutputStream())
wr.write(auth.toString())
wr.flush()