版本: com.alibaba:fastjson:1.2.83
开启 Feature.AllowArbitraryCommas
时,可以正常解析。
关闭 Feature.AllowArbitraryCommas
后,内容相同的json,当为null的strListB在strListA后面就可以正常解析,在strListA前面就会解析失败。异常堆栈如下:
Exception in thread "main" com.alibaba.fastjson.JSONException: not match : - ", info : pos 178, line 9, column 22{
"ret": 0,
"message": "SUCCESS",
"data": {
"nodes": [
{
"innerNode": {
"strListB": null,
"strListA": [
"aaa"
]
}
}
]
}
}
at com.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithChar(JSONLexerBase.java:398)
at com.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithColon(JSONLexerBase.java:380)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseExtra(DefaultJSONParser.java:1656)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:1257)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:893)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:291)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:287)
at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:88)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:858)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:291)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:287)
at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseArray(ArrayListTypeFieldDeserializer.java:185)
at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseField(ArrayListTypeFieldDeserializer.java:71)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:858)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:291)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:287)
at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:88)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:1278)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:893)
at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:291)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:703)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:394)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:362)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:325)
at com.xzy.demo.JsonDemo.main(JsonDemo.java:65)
复现代码
package com.xzy.demo;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.Feature;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
/**
* User: RuzzZZ
* Date: 2023/7/27
* Time: 11:09
*/
@Slf4j
public class JsonDemo {
public static void main(String[] args) {
String str = """
{
"ret": 0,
"message": "SUCCESS",
"data": {
"nodes": [
{
"innerNode": {
"strListA": [
"aaa"
],
"strListB": null
}
}
]
}
}
""";
String str2 = """
{
"ret": 0,
"message": "SUCCESS",
"data": {
"nodes": [
{
"innerNode": {
"strListB": null,
"strListA": [
"aaa"
]
}
}
]
}
}
""";
JSON.DEFAULT_PARSER_FEATURE = Feature.config(JSON.DEFAULT_PARSER_FEATURE, Feature.AllowArbitraryCommas, false);
TypeReference<Result<Data>> typeReference = new TypeReference<>() {
};
// 解析成功
Result<Data> result = JSON.parseObject(str, typeReference.getType());
log.info("result:{}", JSON.toJSONString(result));
// 解析失败
Result<Data> result2 = JSON.parseObject(str2, typeReference.getType());
log.info("result2:{}", JSON.toJSONString(result2));
}
@lombok.Data
private static class Result<T> {
private int ret;
private String message;
private T data;
}
@lombok.Data
private static class Data {
private List<Node> nodes;
}
@lombok.Data
private static class Node {
private InnerNode innerNode;
}
@lombok.Data
private static class InnerNode {
private List<String> strListB;
private List<String> strListA;
}
}
1条答案
按热度按时间7y4bm7vi1#
@wenshao 大佬,麻烦帮忙看一下,复现demo在上面