如何在JSON中正确转义反斜杠(使用GSON进行反序列化)

时间:2014-11-28 17:39:13

标签: java json escaping gson

我见过类似的问题,但似乎都没有解决我遇到的确切问题。我正在处理JSON字符串的反序列化,如下所示:

{

"dst_longitude":0,
"alert_type":"watchlist",
"dst_location":"unknown",
"app":"testapp",
"suppression_end_time":1309561548,
"dstip":"",
"app_session_id":44412,
"client_bytes":0,
"numbytes":0,
"fromlogs":"yes",
"dst_region":"unknown",
"conn_duration":0,
"dst_country":"unknown",
"resp_cnt":8,
"device":"unknown",
"src_zipcode":"unknown",
"req_cnt":8,
"policy":"policy1",
"server_bytes":0,
"dstport":443,
"type":"nspolicy",
"access_method":"sophos",
"dsthost":"dsttst",
"dst_latitude":0,
"timestamp":1309561548,
"src_region":"unknown",
"acked":"false",
"suppression_start_time":1409561333,
"alert":"yes",
"user":"testd\cest.user",
"srcip":"10.10.10.10",
"org":"",
"src_country":"unknown",
"src_location":"unknown",
"appcategory":"testapp",
"src_latitude":0,
"count":8,
"dst_zipcode":"unknown",
"url":"",
"ccl":"medium",
"alert_name":"testalert",
"src_longitude":0,
"_id":"544fd22eba91345ef252b21b"
,"os":"unknown",
"browser":"unknown"

}

问题似乎在反斜杠中,将“用户”字段分隔为域名和用户名令牌。 Gson突然停止解析尝试并显示此错误:

Caused by: com.google.gson.ParseException: Encountered "\"" at line 1, column 582.
Was expecting one of:
<DIGITS> ...
"null" ...
"NaN" ...
"Infinity" ...
<BOOLEAN> ...
<SINGLE_QUOTE_LITERAL> ...
<DOUBLE_QUOTE_LITERAL> ...
"{" ...
"[" ...
"-" ...

at com.google.gson.JsonParserJavacc.generateParseException(JsonParserJavacc.java:658)
at com.google.gson.JsonParserJavacc.jj_consume_token(JsonParserJavacc.java:540)
at com.google.gson.JsonParserJavacc.JsonValue(JsonParserJavacc.java:182)
at com.google.gson.JsonParserJavacc.Pair(JsonParserJavacc.java:89)

错误有点奇怪......它实际上指向'user'字段值中的第一个字符作为问题,声明是一个转义引用。正如您在上面所看到的那样,该字段中的主要字符虽然是引号但未被转义。通过实验,我能够发现值中间的反斜杠实际上是导致错误的原因。

我可以手动修改字符串中的值以转义反斜杠,即"user":"testd\\cest.user",但这对我来说不是真正的解决方案,因为我不以任何方式控制数据源(我'我只是通过单元测试来测试一些样本数据)。我也尝试修改我的Gson创建以禁用html转义,即:

Gson gson = new GsonBuilder().disableHtmlEscaping().create();

但这也没有效果。有人可以解释为什么Gson似乎试图解释用户字段中的反斜杠吗?

我可以上传用于反序列化JSON的代码,但它不是很复杂或有趣,它适用于字段中不包含反斜杠的值,所以我认为我的代码没有任何代码实际问题。

我正在使用Gson 1.3,无法更新它。

1 个答案:

答案 0 :(得分:1)

看起来这是一个错误,并在GSON 1.6中修复:

https://code.google.com/p/google-gson/issues/detail?id=264