我试图从URL中检索JSON数据,但得到了以下错误:
Illegal character ((CTRL-CHAR, code 31)):
only regular white space (\r, \n,\t) is allowed between tokens
我的代码:
final URI uri = new URIBuilder(UrlConstants.SEARCH_URL)
.addParameter("keywords", searchTerm)
.addParameter("count", "50")
.build();
node = new ObjectMapper().readTree(new URL(uri.toString())); <<<<< THROWS THE ERROR
所构造的url为https://www.example.org/api/search.json?keywords=iphone&count=50。
这里出什么问题了?如何成功地解析这些数据?
进口:
import com.google.appengine.repackaged.org.codehaus.jackson.JsonNode;
import com.google.appengine.repackaged.org.codehaus.jackson.map.ObjectMapper;
import com.google.appengine.repackaged.org.codehaus.jackson.node.ArrayNode;
import org.apache.http.client.utils.URIBuilder;
示例响应
{
meta: {
indexAllowed: false
},
products: {
products: [
{
id: 1,
name: "Apple iPhone 6 16GB 4G LTE GSM Factory Unlocked"
},
{
id: 2,
name: "Apple iPhone 7 8GB 4G LTE GSM Factory Unlocked"
}
]
}
}
发布于 2017-03-06 09:42:08
这条信息应该很清楚地说明:
您正在处理的JSON中有一个非法字符(在本例中是字符代码31,即控制代码"Unit“)。
换句话说,您正在接收的数据不是正确的JSON。
背景:
JSON规范(RFC 7159)说:
JSON文本是一系列标记。这组标记包括六个结构字符、字符串、数字和三个文字名称。
..。
在这六个结构字符中的任何一个之前或之后都允许使用不重要的空格。
ws = *(
%x20 /;空间
%x09 /;水平制表符
%x0A /;行馈电或新行
%x0D );运输回报
换句话说: JSON可能包含标记之间的空格(" tokens“表示JSON的一部分,即列表、字符串等),但”空格“定义为只表示字符空间、Tab、行提要和传输返回。
您的文档包含其他内容(代码31),其中只允许空白,因此是无效的JSON。
要解析这一点:
不幸的是,您使用的Jackson库没有提供一种解析这个格式错误的数据的方法。要成功地解析这一点,您必须在JSON被Jackson处理之前过滤它。
您可能需要自己从REST服务中检索(伪)JSON,使用标准的HTTP使用,例如java.net.HttpUrlConnection。然后适当地过滤掉“坏”字符,并将结果字符串传递给杰克逊。如何准确地做到这一点取决于你如何使用杰克逊。
如果你遇到麻烦,可以问一个单独的问题:-)。
发布于 2018-01-31 00:23:41
发布于 2019-06-10 21:04:35
我也有过类似的问题。经过一些研究,我发现restTemplate使用了不支持gzip编码的SimpleClientHttpRequestFactory。要为响应启用gzip编码,需要为rest模板对象- HttpComponentsClientHttpRequestFactory设置一个新的请求工厂。
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
https://stackoverflow.com/questions/42621547
复制相似问题