我从服务器{"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;
}
}
答案 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;
}