由于输入结束杰克逊解析器,无法映射任何内容


76

我正在从服务器收到此响应 {"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;
    }
}

2
这也可能是由于连接超时引起的。如果客户端期望服务器响应,但是HTTP连接器的超时时间已超过-超时将返回“空白”响应-尝试解析为json时可能导致此错误消息。对此的解决方法可能会有所不同-但增加超时时间是一种临时解决方法。
Phas1c

是什么类型的result?难道说叫getResponseAsStringresult两次是问题,由于类型result?例如,许多语言中的迭代器不能被遍历两次。
Manu Chadha

您应将此行更改loginValidator = objectMapper.readValue(result.getResponseAsString(), StatusResponses.class);(res, ...)
Dmitry Zagorulkin,

Answers:


30
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();
}

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


13
认为这是因为调用getResponseAsString()时,它将读取响应中的所有字节并关闭连接。这就是为什么它可能引发异常
Koloritnij

5
之所以有效,是因为您替换了String res,而不是因为Feature.AUTO_CLOSE_SOURCE ....
Abdeali Chandanwala

2
我想你应该给予好评诚实休耕...礼炮......“不知道它是如何工作的,以及为什么它的工作:(但它的工作?”
MAYUR

5
刚刚发布的一段代码不知道为什么它修复该问题值得我downvote ..
dephinera

@Koloritnij我认为您的评论是错误的:this method can be called several times yielding the same result each time
Vic Seedoubleyew

7

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

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

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


2
我的原因是一个空字符串。同样的事情
Shervin Asgari

6

我可以解决此错误。就我而言,问题出在客户端。错误地,我没有关闭正在写入服务器的流。我关闭了流,并且运行正常。甚至错误听起来也像服务器无法识别输入结束。

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

1

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


1

对我来说,问题是我读了两次响应,如下所示:

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

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


0

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

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


0

一个简单的修复可能是 Content-Type: application/json

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

通常你没有设置 Content-Type: application/json在请求时。 Content-Type: application/x-www-form-urlencoded将选择可能导致此异常的原因。



0

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


-3

其一,@JsonProperty("status")@JsonProperty("msg")仅在声明字段时才应存在,而不是在setter和getter上。

实际上,解析此问题的最简单方法是

@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;

}

但是这将如何解决映射异常?如果没有getter和setter方法,我如何访问arrsed值以作进一步使用?
Swapnil 2014年

您仍然可以添加不带注释的getter和setter。我认为您的注释使映射器感到困惑。
Katerina A. 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.