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

时间:2014-11-24 11:51:26

标签: java json jackson

我需要使用java POJO类映射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));
}

上面的块给出了以下错误:

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
at [Source: java.io.BufferedReader@5e66c5fc; 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)

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

3 个答案:

答案 0 :(得分: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 :(得分:1)

使用inputStream bufferedReader似乎都错了。如果您为输入创建了JsonParser,则最好继续将其用于对象映射。缓冲读者可能会急切地从流中读取所有内容,而JSON解析器无需读取任何内容。

if条件下,您的代码中也会缺少一个部分。

这样的事情:

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

额外说明:

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

答案 2 :(得分:0)

我猜您应该使用OutputStreamWriter反序列化您的回复。

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