我正在尝试从 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是ie 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"
}
]
}
}
原文由 rogger2016 发布,翻译遵循 CC BY-SA 4.0 许可协议
该消息应该是不言自明的:
您正在处理的 JSON 中存在非法字符(在本例中为字符代码 31,即控制代码“单元分隔符”)。
换句话说,您收到的数据不是正确的 JSON。
背景:
JSON 规范 ( RFC 7159 ) 说:
换句话说:JSON 可能在标记之间包含空格(“标记”表示 JSON 的一部分,即列表、字符串等),但“空格”被定义为仅表示字符 Space、Tab、Line feed 和 Carriage return .
您的文档包含其他内容(代码 31),其中只允许使用空格,因此不是有效的 JSON。
要解析这个:
不幸的是,您使用的 Jackson 库没有提供解析这种格式错误的数据的方法。要成功解析它,您必须在 Jackson 处理之前过滤 JSON。
您可能必须自己从 REST 服务中检索(伪)JSON,使用标准 HTTP,例如 java.net.HttpUrlConnection 。然后适当过滤掉“坏”字符,并将结果字符串传递给 Jackson。如何做到这一点完全取决于您如何使用 Jackson。
如果您遇到问题,请随时提出单独的问题 :-)。