解析JSON时jackson错误“非法字符…只允许常规空格”
我试图从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:
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语法
JSON文本是一系列标记。 这组令牌包括六个结构字符,字符串,数字和三个文字名称。
[…]
在六个结构字符中的任何一个之前或之后允许无关紧要的空白。
ws = *(
%x20 /; 空间
%x09 /; 水平标签
%x0A /; 换行或换行
%x0D); 回程
换句话说:JSON可能在标记之间包含空格(“标记”表示JSON的一部分,即列表,字符串等),但“空白”定义为仅表示字符Space,Tab,Line feed和Carriage return 。
您的文档包含其他内容(代码31),其中只允许空格,因此不是有效的JSON。
解析这个:
不幸的是,您使用的Jackson库没有提供解析这种格式错误的数据的方法。 要成功解析此问题,您必须在Jackson处理之前过滤JSON。
您可能必须使用标准HTTP(例如java.net.HttpUrlConnection )从REST服务中自行检索(伪)JSON。 然后适当地过滤掉“坏”字符,并将结果字符串传递给jackson。 如何做到这完全取决于你如何使用jackson。
如果您遇到麻烦,请随时提出单独的问题:-)。
我遇到了同样的问题,我发现它是由Content-Encoding: gzip
标头引起的。 客户端应用程序(抛出exception)无法处理此内容编码。 FWIW客户端应用程序使用的是io.github.openfeign:feign-core:9.5.0
,这个库似乎在压缩( 链接 )方面存在一些问题。
您可以尝试将头文件Accept-Encoding: identity
到您的请求中,但是,并非所有Web服务器/ Web应用程序都配置正确,有些人似乎忽略了此标头。 有关如何防止gzip压缩内容的详细信息,请参阅此问题 。
- 如何配置Jackson以默认键入反序列化命名类型?
- JSON到JSON转换器
- RestEasy:org.codehaus.jackson.map.JsonMappingException:无法从START_OBJECT标记(..)中反序列化java.util.ArrayList的实例
- 使用Jongo和MongoDB在Jackson反序列化中将ObjectId _id重命名为id
- Spring 3.2和Jackson 2:添加自定义对象映射器
- 如何通过jackson生成器html转义值
- 如何将ObjectId序列化为JSON?
- 使用Jackson(Joda-Time模块)进行DateTime反序列化的默认时区
- 无法获得jersey 2应用程序使用自定义jackson XmlMapper