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

我试图从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"
            }
        ]
    }
}

解决方法:

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

您正在处理的JSON中存在非法字符(在本例中为字符代码31,即控制代码“Unit Separator”).

换句话说,您收到的数据不是正确的JSON.

背景:

JSON规范(RFC 7159)说:

  1. JSON Grammar

A JSON text is a sequence of tokens. The set of tokens includes six
tructural characters, strings, numbers, and three literal names.

[…]

Insignificant whitespace is allowed before or after any of the
six structural characters.

ws = *(

%x20 / ; Space

%x09 / ; Horizontal tab

%x0A / ; Line feed or New line

%x0D ) ; Carriage return

换句话说:JSON可能包含令牌之间的空格(“令牌”表示JSON的一部分,即列表,字符串等),但“空白”定义为仅表示字符Space,Tab,Line feed和Carriage return .

您的文档包含其他内容(代码31),其中只允许空格,因此不是有效的JSON.

解析这个:

不幸的是,您使用的Jackson库没有提供解析这种格式错误的数据的方法.要成功解析此问题,您必须在Jackson处理之前过滤JSON.

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

如果遇到麻烦,请随意提出单独的问题:-).

上一篇:Java:JSON和Map相互转换


下一篇:数据结构与算法JavaScript描述——栈