杰克逊错误“非法字符...解析 JSON 时只允许常规空格”

2022-09-02 11:27:50

我正在尝试从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"
            }
        ]
    }
}

答案 1

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

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


答案 2

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

restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());