解析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 )说:

  1. 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压缩内容的详细信息,请参阅此问题 。