【问题标题】:com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-inputcom.fasterxml.jackson.databind.JsonMappingException:由于输入结束,没有要映射的内容
【发布时间】:2017-12-30 20:08:21
【问题描述】:

我需要用 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)

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

【问题讨论】:

    标签: java json jackson


    【解决方案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;
    

    这里再次创建响应并返回。

    如果有任何更新,请告诉我。

    【讨论】:

      【解决方案2】:

      同时使用 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 设置默认值

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-12-23
          • 2018-01-30
          • 2018-09-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-13
          • 1970-01-01
          相关资源
          最近更新 更多