正在使用 Spring RestTemplate 解析 Json 文件
Parsing Json file using Spring RestTemplate
我有一个基本的 Spring 启动应用程序。使用 Spring 初始化程序,嵌入 Tomcat,Thymeleaf 模板引擎,并打包为可执行 JAR。
我连接到 URL 并打印响应:
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
StringBuilder response = new StringBuilder("");
String output;
while ((output = br.readLine()) != null) {
response.append(output);
}
结果如下:
{"data":[{"device":"18AE63","time":1494516023,"data":"3235","snr":"36.72","linkQuality":"GOOD"},{"device":"18AE63","time":1494515750,"data":"484f4c41","snr":"35.69","linkQuality":"GOOD"}],"paging":{}}
但是当我使用 RestTemplate 时
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.ALL));
messageConverters.add(converter);
restTemplate.setMessageConverters(messageConverters);
MessageList messageList =
restTemplate.getForObject(url, MessageList.class);
我收到这个错误:
Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON document: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@1d119efb; line: 1, column: 2]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@1d119efb; line: 1, column: 2]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:234)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:219)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)
at com.tdk.web.controllers.restful.client.RestTemplateGETExample.main(RestTemplateGETExample.java:49)
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@1d119efb; line: 1, column: 2]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1702)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:558)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:456)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2689)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:878)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:772)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3834)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3783)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2922)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:231)
... 6 more
POJO:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"data",
"paging"
})
public class MessageList {
@JsonProperty("data")
private List<Message> data = null;
@JsonProperty("paging")
private Paging paging;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("data")
public List<Message> getData() {
return data;
}
@JsonProperty("data")
public void setData(List<Message> data) {
this.data = data;
}
@JsonProperty("paging")
public Paging getPaging() {
return paging;
}
@JsonProperty("paging")
public void setPaging(Paging paging) {
this.paging = paging;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
@Override
public String toString() {
return "MessageList [data=" + data + ", paging=" + paging + ", additionalProperties=" + additionalProperties
+ "]";
}
}
您得到的响应是 HTML,而不是 JSON。
JsonParseException: Unexpected character ('<' (code 60))
这通常意味着您的 HTTP 调用收到 HTML 错误响应(认为 <html><h1>404 Not Found</h1>...</html>
),因此 JSON 解析器抱怨响应无效 JSON .
我有一个基本的 Spring 启动应用程序。使用 Spring 初始化程序,嵌入 Tomcat,Thymeleaf 模板引擎,并打包为可执行 JAR。
我连接到 URL 并打印响应:
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
StringBuilder response = new StringBuilder("");
String output;
while ((output = br.readLine()) != null) {
response.append(output);
}
结果如下:
{"data":[{"device":"18AE63","time":1494516023,"data":"3235","snr":"36.72","linkQuality":"GOOD"},{"device":"18AE63","time":1494515750,"data":"484f4c41","snr":"35.69","linkQuality":"GOOD"}],"paging":{}}
但是当我使用 RestTemplate 时
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setSupportedMediaTypes(Arrays.asList(MediaType.ALL));
messageConverters.add(converter);
restTemplate.setMessageConverters(messageConverters);
MessageList messageList =
restTemplate.getForObject(url, MessageList.class);
我收到这个错误:
Exception in thread "main" org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON document: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@1d119efb; line: 1, column: 2]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@1d119efb; line: 1, column: 2]
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:234)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:219)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:95)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:655)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:613)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:287)
at com.tdk.web.controllers.restful.client.RestTemplateGETExample.main(RestTemplateGETExample.java:49)
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.PushbackInputStream@1d119efb; line: 1, column: 2]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1702)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:558)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:456)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2689)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:878)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:772)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3834)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3783)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2922)
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:231)
... 6 more
POJO:
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"data",
"paging"
})
public class MessageList {
@JsonProperty("data")
private List<Message> data = null;
@JsonProperty("paging")
private Paging paging;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("data")
public List<Message> getData() {
return data;
}
@JsonProperty("data")
public void setData(List<Message> data) {
this.data = data;
}
@JsonProperty("paging")
public Paging getPaging() {
return paging;
}
@JsonProperty("paging")
public void setPaging(Paging paging) {
this.paging = paging;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
@Override
public String toString() {
return "MessageList [data=" + data + ", paging=" + paging + ", additionalProperties=" + additionalProperties
+ "]";
}
}
您得到的响应是 HTML,而不是 JSON。
JsonParseException: Unexpected character ('<' (code 60))
这通常意味着您的 HTTP 调用收到 HTML 错误响应(认为 <html><h1>404 Not Found</h1>...</html>
),因此 JSON 解析器抱怨响应无效 JSON .