Java 由于输入结束,没有要映射的内容

Java 由于输入结束,没有要映射的内容,java,android,json,jackson,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] 为什么我们会有这样的例外

我从服务器
{“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();
}
状态响应类

@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;
    }
}
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({“status”,“msg”})
公共类状态响应{
@JsonProperty(“状态”)
公共字符串getStatus(){
返回状态;
}
@JsonProperty(“状态”)
公共无效设置状态(字符串状态){
这个状态=状态;
}
@JsonProperty(“msg”)
公共字符串getMessage(){
返回消息;
}
@JsonProperty(“msg”)
公共无效设置消息(字符串消息){
this.message=消息;
}
@JsonProperty(“状态”)
私有字符串状态;
@JsonProperty(“msg”)
私有字符串消息;
私有映射additionalProperties=new HashMap();
@琼格特
公共映射getAdditionalProperties(){
返回附加属性;
}
@杰森塞特
public void setAdditionalProperties(映射additionalProperties){
this.additionalProperties=additionalProperties;
}
}

对于其中一个,
@JsonProperty(“status”)
@JsonProperty(“msg”)
只应在声明字段时出现,而不应出现在setter和geter上

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

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

}

不知道它是怎么工作的,为什么工作的(但它工作正常

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

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

今天我遇到了一个类似的错误,问题是post请求的内容类型头。请确保内容类型是您所期望的。在我的例子中,
多部分/表单数据
内容类型头被发送到API,而不是
应用程序/json

。在我的例子中,我在jersey RequestEventListener中读取流在处理请求之前,我在服务器端创建了一个日志来记录请求主体。然后我意识到这可能会导致后续读取不产生任何字符串(这是运行业务逻辑时传递的字符串)。我验证了这一点


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

在我的例子中,问题是由于我将null InputStream传递给ObjectMapper.readValue调用引起的:

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

我猜这是这个异常最常见的原因。

一个简单的修复方法可能是
内容类型:application/json

您可能正在进行RESTAPI调用以获取响应

大多数情况下,您在处理请求时没有设置
内容类型:application/json

内容类型:将选择可能导致此异常的应用程序/x-www-form-urlencoded

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


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

我的问题是,我按如下方式读取了两次响应:

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

但是,响应只能读取一次,因为它是一个流。

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

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


就我而言,今天,我正在进行HTTP调用,并且(愚蠢地)在尝试解组响应主体之前忽略检查HTTP状态代码=>我真正的问题实际上是我有一些身份验证错误,这导致
401未经授权的
返回给我,主体是空的。因为我没有检查任何东西就直接解组了空主体,所以我得到了这个e> 由于输入结束,没有要映射的内容
,没有关于身份验证问题的任何线索。

但是这将如何解决映射异常?如果没有getter和setter,我如何访问arsed值以供进一步使用?您仍然可以添加getter和setter而不添加批注。我认为您的批注混淆了mapp呃。我想这是因为当你调用getResponseAsString()时,它会从响应和关闭连接中读取所有字节。这就是为什么它可能会抛出异常。这是因为你替换了字符串res,而不是因为Feature.AUTO\u close\u SOURCE…我想你应该为“不知道它是如何工作的,为什么工作的?”(但它工作了)诚实的休闲…敬礼…只是发布一段代码而不知道它为什么解决了这个问题值得我投反对票。@Koloritnij我认为你的评论是错误的:
这个方法可以多次调用,每次都会产生相同的结果
这也可能是由于连接超时造成的。如果客户端希望从但HTTP连接器的超时时间已超过-它将返回“空白”超时响应-在尝试解析为json时可能会导致此错误消息。对此的修复会有所不同-但延长超时时间是一个临时修复。
result
的类型是什么?是否会因为
result
的类型而导致调用
getResponseAsString
两次t
?许多语言中的迭代器不能被遍历两次
ObjectMapper objectMapper = ...
InputStream is = null; // The code here was returning null.
Foo foo = objectMapper.readValue(is, Foo.class)