我试图从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
构建的网址是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"
}
]
}
}
解决方法:
该消息应该是不言自明的:
您正在处理的JSON中存在非法字符(在本例中为字符代码31,即控制代码“Unit Separator”).
换句话说,您收到的数据不是正确的JSON.
背景:
JSON规范(RFC 7159)说:
- JSON Grammar
A JSON text is a sequence of tokens. The set of tokens includes six
tructural characters, strings, numbers, and three literal names.[…]
Insignificant whitespace is allowed before or after any of the
six structural characters.ws = *(
%x20 / ; Space
%x09 / ; Horizontal tab
%x0A / ; Line feed or New line
%x0D ) ; Carriage return
换句话说:JSON可能包含令牌之间的空格(“令牌”表示JSON的一部分,即列表,字符串等),但“空白”定义为仅表示字符Space,Tab,Line feed和Carriage return .
您的文档包含其他内容(代码31),其中只允许空格,因此不是有效的JSON.
解析这个:
不幸的是,您使用的Jackson库没有提供解析这种格式错误的数据的方法.要成功解析此问题,您必须在Jackson处理之前过滤JSON.
您可能必须自己从REST服务中检索(伪)JSON,使用标准HTTP,例如, java.net.HttpUrlConnection.然后适当地过滤掉“坏”字符,并将结果字符串传递给杰克逊.如何做到这完全取决于你如何使用杰克逊.
如果遇到麻烦,请随意提出单独的问题:-).