然后我尝试使用 Jackson API 两次解析 json 输入流,我得到一个 java.io.EOFException
I am then trying to use the Jackson API to parse the json input stream twice and I get an java.io.EOFException
我的ParserCheck.java:-
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class ParserCheck {
public static void main(String[] args){
ObjectMapper objectMapper = new ObjectMapper();
String responseJson = "{\"status\":\"200\",\"message\":\"Success\"}";
InputStream streamResponse = IOUtils.toInputStream(responseJson);
try {
MyJsonResponse response = objectMapper.readValue(streamResponse, MyJsonResponse.class);
System.out.println(response);
} catch ( JsonParseException | JsonMappingException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
try {
MyJsonResponse response = objectMapper.readValue(streamResponse, MyJsonResponse.class);
System.out.println(response);
} catch ( JsonParseException | JsonMappingException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}finally{
try {
streamResponse.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我的JsonResponse.java:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class MyJsonResponse {
@JsonProperty
private Integer status;
@JsonProperty
private String message;
public Integer getStatus() {
return status;
}
public String getMessage() {
return message;
}
@Override
public String toString(){
return "Json Response [Status ="+ status +", Message =" + message + " ]";
}
}
我第一次得到正确的输出,但第二次我得到一个异常。
这是输出:
Json Response [Status =200, Message =Success ]java.io.EOFException: No content to map to Object due to end of input
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2775)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2718)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1909)
at.service.provider.ParserCheck.main(ParserCheck.java:33)
遇到这种情况应该怎么办。我尝试在第一次输出后关闭流,但它仍然给我异常。
您正在重复使用流。第一次打电话给
objectMapper.readValue(streamResponse, MyJsonResponse.class);
读取流到最后,所以当你第二次调用它的时候,流已经没有内容了。例如。
stremResponse.read() returns -1
您使用流有什么原因吗?我试过了:
MyJsonResponse response = objectMapper.readValue(responseJson, MyJsonResponse.class);
按预期工作。
我的ParserCheck.java:-
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.io.IOUtils;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
public class ParserCheck {
public static void main(String[] args){
ObjectMapper objectMapper = new ObjectMapper();
String responseJson = "{\"status\":\"200\",\"message\":\"Success\"}";
InputStream streamResponse = IOUtils.toInputStream(responseJson);
try {
MyJsonResponse response = objectMapper.readValue(streamResponse, MyJsonResponse.class);
System.out.println(response);
} catch ( JsonParseException | JsonMappingException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}
try {
MyJsonResponse response = objectMapper.readValue(streamResponse, MyJsonResponse.class);
System.out.println(response);
} catch ( JsonParseException | JsonMappingException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}finally{
try {
streamResponse.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我的JsonResponse.java:
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.map.annotate.JsonSerialize;
@JsonIgnoreProperties(ignoreUnknown=true)
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class MyJsonResponse {
@JsonProperty
private Integer status;
@JsonProperty
private String message;
public Integer getStatus() {
return status;
}
public String getMessage() {
return message;
}
@Override
public String toString(){
return "Json Response [Status ="+ status +", Message =" + message + " ]";
}
}
我第一次得到正确的输出,但第二次我得到一个异常。 这是输出:
Json Response [Status =200, Message =Success ]java.io.EOFException: No content to map to Object due to end of input
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2775)
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2718)
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1909)
at.service.provider.ParserCheck.main(ParserCheck.java:33)
遇到这种情况应该怎么办。我尝试在第一次输出后关闭流,但它仍然给我异常。
您正在重复使用流。第一次打电话给
objectMapper.readValue(streamResponse, MyJsonResponse.class);
读取流到最后,所以当你第二次调用它的时候,流已经没有内容了。例如。
stremResponse.read() returns -1
您使用流有什么原因吗?我试过了:
MyJsonResponse response = objectMapper.readValue(responseJson, MyJsonResponse.class);
按预期工作。