java拦截json提交的数据有非法字符,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

这里出了什么问题?我怎样才能成功解析这些数据?

进口:

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

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,jackson,objectmapper

来源: https://codeday.me/bug/20191007/1869025.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值