fastjson 反序列化时,因为正则表达式的特殊字符串出错

ewm0tg9j  于 2021-11-27  发布在  Java
关注(0)|答案(3)|浏览(773)
String jsonStr = "{\"reg\":\"(\\.|\\?){3,}\"}";
JSON.parseObject(jsonStr);

对以上这种JSON数据进行反序列化时会报错:

com.alibaba.fastjson.JSONException: unclosed string : .
	at com.alibaba.fastjson.parser.JSONLexerBase.scanString(JSONLexerBase.java:989)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:469)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1367)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1333)
	at com.alibaba.fastjson.JSON.parse(JSON.java:152)
	at com.alibaba.fastjson.JSON.parse(JSON.java:162)
	at com.alibaba.fastjson.JSON.parse(JSON.java:131)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:223)

jsonStr这个字符串的System.out.println()结果是:{"reg":"(\.|\?){3,}"}

怎么处理呢?使用的版本是1.2.56

我尝试了以下这个json库在反序列化时没有问题

net.sf.json.JSONSerializer.toJSON(jsonStr)

不过它的做法是删除其中的“\”符号,反序列化后的JSON再序列化后,字符串会变为:

{"reg":"(.|?){3,}"}
ki1q1bka

ki1q1bka1#

应该这样吧

String jsonStr = "{"reg":"(\.|\?){3,}"}";
JSON.parseObject(jsonStr);

cfh9epnr

cfh9epnr3#

@edwardpan 反斜杠\,每被双引号包一层,就需要转义一次,上面的正则表达式被两层引号包起来了,因此如果想要表达单个\,则在引号内应该是 "\"\\\\\""。对于"{\"reg\":\"(\\.|\\?){3,}\"}",处理的时候变成了对符号.进行转义,因此会报错。应该输入如下字符串:

String jsonStr = "{\"reg\":\"(\\\\.|\\\\?){3,}\"}";
    obj = JSON.parseObject(jsonStr);
    System.out.println(obj);

输出为:{"reg":"(\\.|\\?){3,}"}

相关问题