由于输入结束的jackson解析器,没有要映射的内容

时间:2014-11-14 07:33:11

标签: java android json jackson

我从服务器{"status":"true","msg":"success"}

收到此回复

我正在尝试使用Jackson解析器库解析这个json字符串但不知何故我正面临映射异常陈述

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
 at [Source: java.io.StringReader@421ea4c0; line: 1, column: 1]

为什么我们会遇到这种例外?

如何理解导致此异常的原因?

我正在尝试使用以下方式解析:

StatusResponses loginValidator = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);

try {
    String res = result.getResponseAsString();//{"status":"true","msg":"success"}
    loginValidator = objectMapper.readValue(result.getResponseAsString(), StatusResponses.class);
} catch (Exception e) {
    e.printStackTrace();
}

StatusResponse类

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({ "status","msg" })
public class StatusResponses {

    @JsonProperty("status")
    public String getStatus() {
        return status;
    }

    @JsonProperty("status")
    public void setStatus(String status) {
        this.status = status;
    }

    @JsonProperty("msg")
    public String getMessage() {
        return message;
    }

    @JsonProperty("msg")
    public void setMessage(String message) {
        this.message = message;
    }

    @JsonProperty("status")
    private String status;

    @JsonProperty("msg")
    private String message;

    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

    @JsonGetter
    public Map<String, Object> getAdditionalProperties() {
        return additionalProperties;
    }

    @JsonSetter
    public void setAdditionalProperties(Map<String, Object> additionalProperties) {
        this.additionalProperties = additionalProperties;
    }
}

11 个答案:

答案 0 :(得分:18)

import com.fasterxml.jackson.core.JsonParser.Feature;
import com.fasterxml.jackson.databind.ObjectMapper;

StatusResponses loginValidator = null;

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(Feature.AUTO_CLOSE_SOURCE, true);

try {
    String res = result.getResponseAsString();//{"status":"true","msg":"success"}
    loginValidator = objectMapper.readValue(res, StatusResponses.class);//replaced result.getResponseAsString() with res
} catch (Exception e) {
    e.printStackTrace();
}

不知道它是如何工作的以及为什么有效? :(但它有效

答案 1 :(得分:5)

我可以修复此错误。就我而言,问题出在客户端。错误地,我没有关闭我写入服务器的流。我关闭了流,它工作正常。即使错误听起来像服务器也无法识别输入结束。

OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(jsonstring.getBytes());
out.close() ; //This is what I did

答案 2 :(得分:2)

在我的情况下,问题是由于我向ObjectMapper.readValue调用传递了一个空InputStream引起的:

ObjectMapper objectMapper = ...
InputStream is = null; // The code here was returning null.
Foo foo = objectMapper.readValue(is, Foo.class)

我猜这是发生此异常的最常见原因。

答案 3 :(得分:2)

这个错误有时(通常?)隐藏了真正的问题:失败条件可能导致内容不正确,然后无法反序列化。

就我而言,今天,我进行了 HTTP 调用,并且(愚蠢地)在尝试解组响应正文之前忽略了检查 HTTP 状态代码 => 我真正的问题实际上是我遇到了一些身份验证错误,这导致一个 401 Unauthorized 被送回给我,一个空的身体。由于我在没有检查任何内容的情况下直接解组了该空正文,因此我得到了这个 No content to map due to end-of-input,而没有得到任何关于身份验证问题的线索。

答案 4 :(得分:1)

对我来说,问题是我读了两次以下答复:

System.out.println(response.body().string());
getSucherResponse = objectMapper.readValue(response.body().string(), GetSucherResponse.class);

但是,由于响应是流,因此只能读取一次。

答案 5 :(得分:0)

我今天有一个类似的错误,问题是发布请求的内容类型标头。确保内容类型符合您的期望。在我的情况下,“ multipart / form-data”内容类型标头被发送到API,而不是“ application / json”。

答案 6 :(得分:0)

在我的情况下,我正在服务器上创建的泽西岛RequestEventListener中读取流,以在处理请求之前记录请求主体。然后,我意识到这可能导致随后的读取不产生任何字符串(这是运行业务逻辑时传递的内容)。我证实确实如此。

因此,如果您使用流读取JSON字符串,请注意这一点。

答案 7 :(得分:0)

一个简单的解决方法可以是Content-Type: application/json

您可能正在进行REST API调用以获取响应。

通常,您在请求时并未设置Content-Type: application/json。 将选择Content-Type: application/x-www-form-urlencoded,这可能会导致此异常。

答案 8 :(得分:0)

我知道这很奇怪,但是当我将客户端和服务器端的 GetMapping 更改为 PostMapping 时,错误消失了。

客户端和服务器都是Spring启动项目。

答案 9 :(得分:0)

与邮递员发送GET请求时遇到此错误。 该请求不需要任何参数。 我的错误是我在请求正文中有一个空白行。

答案 10 :(得分:-2)

首先,@JsonProperty("status")@JsonProperty("msg")只应在声明字段时出现,而不是在设置者和geters上。

事实上,解析这个的最简单方法是

@JsonAutoDetect  //if you don't want to have getters and setters for each JsonProperty
public class StatusResponses {

   @JsonProperty("status")
   private String status;

   @JsonProperty("msg")
   private String message;

}