fastjson 关闭Feature.AllowArbitraryCommas功能后,json解析对null值处理发生错误

vjhs03f7  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(85)

版本: com.alibaba:fastjson:1.2.83
开启 Feature.AllowArbitraryCommas 时,可以正常解析。
关闭 Feature.AllowArbitraryCommas 后,内容相同的json,当为null的strListB在strListA后面就可以正常解析,在strListA前面就会解析失败。异常堆栈如下:

  1. Exception in thread "main" com.alibaba.fastjson.JSONException: not match : - ", info : pos 178, line 9, column 22{
  2. "ret": 0,
  3. "message": "SUCCESS",
  4. "data": {
  5. "nodes": [
  6. {
  7. "innerNode": {
  8. "strListB": null,
  9. "strListA": [
  10. "aaa"
  11. ]
  12. }
  13. }
  14. ]
  15. }
  16. }
  17. at com.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithChar(JSONLexerBase.java:398)
  18. at com.alibaba.fastjson.parser.JSONLexerBase.nextTokenWithColon(JSONLexerBase.java:380)
  19. at com.alibaba.fastjson.parser.DefaultJSONParser.parseExtra(DefaultJSONParser.java:1656)
  20. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:1257)
  21. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:893)
  22. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:291)
  23. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:287)
  24. at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:88)
  25. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:858)
  26. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:291)
  27. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:287)
  28. at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseArray(ArrayListTypeFieldDeserializer.java:185)
  29. at com.alibaba.fastjson.parser.deserializer.ArrayListTypeFieldDeserializer.parseField(ArrayListTypeFieldDeserializer.java:71)
  30. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:858)
  31. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:291)
  32. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:287)
  33. at com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer.parseField(DefaultFieldDeserializer.java:88)
  34. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.parseField(JavaBeanDeserializer.java:1278)
  35. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:893)
  36. at com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer.deserialze(JavaBeanDeserializer.java:291)
  37. at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:703)
  38. at com.alibaba.fastjson.JSON.parseObject(JSON.java:394)
  39. at com.alibaba.fastjson.JSON.parseObject(JSON.java:362)
  40. at com.alibaba.fastjson.JSON.parseObject(JSON.java:325)
  41. at com.xzy.demo.JsonDemo.main(JsonDemo.java:65)

复现代码

  1. package com.xzy.demo;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.TypeReference;
  4. import com.alibaba.fastjson.parser.Feature;
  5. import lombok.extern.slf4j.Slf4j;
  6. import java.util.List;
  7. /**
  8. * User: RuzzZZ
  9. * Date: 2023/7/27
  10. * Time: 11:09
  11. */
  12. @Slf4j
  13. public class JsonDemo {
  14. public static void main(String[] args) {
  15. String str = """
  16. {
  17. "ret": 0,
  18. "message": "SUCCESS",
  19. "data": {
  20. "nodes": [
  21. {
  22. "innerNode": {
  23. "strListA": [
  24. "aaa"
  25. ],
  26. "strListB": null
  27. }
  28. }
  29. ]
  30. }
  31. }
  32. """;
  33. String str2 = """
  34. {
  35. "ret": 0,
  36. "message": "SUCCESS",
  37. "data": {
  38. "nodes": [
  39. {
  40. "innerNode": {
  41. "strListB": null,
  42. "strListA": [
  43. "aaa"
  44. ]
  45. }
  46. }
  47. ]
  48. }
  49. }
  50. """;
  51. JSON.DEFAULT_PARSER_FEATURE = Feature.config(JSON.DEFAULT_PARSER_FEATURE, Feature.AllowArbitraryCommas, false);
  52. TypeReference<Result<Data>> typeReference = new TypeReference<>() {
  53. };
  54. // 解析成功
  55. Result<Data> result = JSON.parseObject(str, typeReference.getType());
  56. log.info("result:{}", JSON.toJSONString(result));
  57. // 解析失败
  58. Result<Data> result2 = JSON.parseObject(str2, typeReference.getType());
  59. log.info("result2:{}", JSON.toJSONString(result2));
  60. }
  61. @lombok.Data
  62. private static class Result<T> {
  63. private int ret;
  64. private String message;
  65. private T data;
  66. }
  67. @lombok.Data
  68. private static class Data {
  69. private List<Node> nodes;
  70. }
  71. @lombok.Data
  72. private static class Node {
  73. private InnerNode innerNode;
  74. }
  75. @lombok.Data
  76. private static class InnerNode {
  77. private List<String> strListB;
  78. private List<String> strListA;
  79. }
  80. }
7y4bm7vi

7y4bm7vi1#

@wenshao 大佬,麻烦帮忙看一下,复现demo在上面

相关问题