[alibaba/fastjson]JSON.isValidObject 存在bug,明显不是json有效json对象的字符串返回true

2025-10-28 232 views
2

image

测试字符串

{1"local":{1"id":376648,1"bit":45,1"frame":151},1"remote":[1{1"id":814457,1"bit":58,1"frame":8,1"w":240,1"h":1801},1{1"id":1317201,1"bit":59,1"frame":10,1"w":240,1"h":1801},1{1"id":1337865,1"bit":61,1"frame":10,1"w":240,1"h":1801},1{1"id":1462739,1"bit":57,1"frame":8,1"w":240,1"h":1801}1]1}

回答

9

1.2.63_preview_01版本中,JSONScanner.skipObject(boolean valid)2309行,没有对括号附近的值进行处理,我主要对括号前后的值进行了一下判断,让代码逻辑正常。 image image

1

可以使用1.2.60版本中新增的高性能JSON字符串校验API: https://github.com/alibaba/fastjson/wiki/JSONValidator

你好,这个校验也是有问题的,next()方法没有对最后一个值做校验,导致判断出现问题 if (this.pos >= this.str.length()) { //TODO 新增的条件判断 if(this.str.charAt(this.str.length()-1)!='}'){ error(); }else{ ch = '\0'; eof = true; } }

4
    @Test
    public void testFastJSON() {
        JSONValidator a = JSONValidator.from("{1\"local\":{1\"id\":376648,1\"bit\":45,1\"frame\":151},1\"remote\":[1{1\"id\":814457,1\"bit\":58,1\"frame\":8,1\"w\":240,1\"h\":1801},1{1\"id\":1317201,1\"bit\":59,1\"frame\":10,1\"w\":240,1\"h\":1801},1{1\"id\":1337865,1\"bit\":61,1\"frame\":10,1\"w\":240,1\"h\":1801},1{1\"id\":1462739,1\"bit\":57,1\"frame\":8,1\"w\":240,1\"h\":1801}1]1}");
        Assert.assertFalse(a.validate());
    }

目前试了一下,不会报错了,JSON.isValidObject 已经弃用了,使用JSONValidator.from().validate() 即可。可以close了 @ElvisWang