首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Jackson在解析JSON时出错“非法字符.只有常规空白”

Jackson在解析JSON时出错“非法字符.只有常规空白”
EN

Stack Overflow用户
提问于 2017-03-06 09:09:42
回答 7查看 45.5K关注 0票数 20

我试图从URL中检索JSON数据,但得到了以下错误:

代码语言:javascript
运行
复制
Illegal character ((CTRL-CHAR, code 31)):
only regular white space (\r, \n,\t) is allowed between tokens

我的代码:

代码语言:javascript
运行
复制
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

这里出什么问题了?如何成功地解析这些数据?

进口:

代码语言:javascript
运行
复制
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;

示例响应

代码语言:javascript
运行
复制
{
    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"
            }
        ]
    }
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-03-06 09:42:08

这条信息应该很清楚地说明:

您正在处理的JSON中有一个非法字符(在本例中是字符代码31,即控制代码"Unit“)。

换句话说,您正在接收的数据不是正确的JSON。

背景:

JSON规范(RFC 7159)说:

  1. JSON语法

JSON文本是一系列标记。这组标记包括六个结构字符、字符串、数字和三个文字名称。

..。

在这六个结构字符中的任何一个之前或之后都允许使用不重要的空格。

ws = *(

%x20 /;空间

%x09 /;水平制表符

%x0A /;行馈电或新行

%x0D );运输回报

换句话说: JSON可能包含标记之间的空格(" tokens“表示JSON的一部分,即列表、字符串等),但”空格“定义为只表示字符空间、Tab、行提要和传输返回。

您的文档包含其他内容(代码31),其中只允许空白,因此是无效的JSON。

要解析这一点:

不幸的是,您使用的Jackson库没有提供一种解析这个格式错误的数据的方法。要成功地解析这一点,您必须在JSON被Jackson处理之前过滤它。

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

如果你遇到麻烦,可以问一个单独的问题:-)。

票数 8
EN

Stack Overflow用户

发布于 2018-01-31 00:23:41

我也遇到了同样的问题,我发现它是由Content-Encoding: gzip头造成的。客户端应用程序(在其中抛出异常)无法处理此内容编码。客户端应用程序使用的是io.github.openfeign:feign-core:9.5.0,这个库似乎存在一些关于压缩(链接)的问题。

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

票数 31
EN

Stack Overflow用户

发布于 2019-06-10 21:04:35

我也有过类似的问题。经过一些研究,我发现restTemplate使用了不支持gzip编码的SimpleClientHttpRequestFactory。要为响应启用gzip编码,需要为rest模板对象- HttpComponentsClientHttpRequestFactory设置一个新的请求工厂。

restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42621547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档