解析 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是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 许可协议

阅读 2k
2 个回答

该消息应该是不言自明的:

您正在处理的 JSON 中存在非法字符(在本例中为字符代码 31,即控制代码“单元分隔符”)。

换句话说,您收到的数据不是正确的 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。

您可能必须自己从 REST 服务中检索(伪)JSON,使用标准 HTTP,例如 java.net.HttpUrlConnection 。然后适当过滤掉“坏”字符,并将结果字符串传递给 Jackson。如何做到这一点完全取决于您如何使用 Jackson。

如果您遇到问题,请随时提出单独的问题 :-)。

原文由 sleske 发布,翻译遵循 CC BY-SA 4.0 许可协议

我遇到了同样的问题,我发现它是由 Content-Encoding: gzip 标头引起的。客户端应用程序(抛出异常)无法处理此内容编码。 FWIW 客户端应用程序正在使用 io.github.openfeign:feign-core:9.5.0 ,并且该库似乎在压缩方面存在一些问题( 链接)。

您可以尝试将标头 Accept-Encoding: identity 添加到您的请求中,但是,并非所有 Web 服务器/Web 应用程序都配置正确,有些似乎忽略了此标头。有关如何防止压缩内容的更多详细信息,请参阅 此问题

原文由 ChocolateAndCheese 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题