fastjson Fail to parse object reference to a map value with special key with dot .

hjqgdpho  于 2022-10-27  发布在  其他
关注(0)|答案(3)|浏览(131)

I have tried version 1.2.47 , 1.2.58 , 1.2.68.noneautotype , 1.2.76 , but failed with different errors.

public static class Foo {
        private String name;
        private String value;

        public Foo(String name, String value) {
            this.name = name;
            this.value = value;
        }

        public String getName() {
            return name;
        }

        public String getValue() {
            return value;
        }

    }

    @Test
    public void test3() throws Exception {
        Foo value = new Foo("aaa", "bbb");
        Foo value2 = new Foo("aaa", "bbb");
        Map<String, Object> object = new HashMap<>();
        object.put("127.0.0.1:1111", value);
        String s = JSON.toJSONString(new Object[]{object, value, value2});
        assertEquals(
                "[{\"127.0.0.1:1111\":{\"name\":\"aaa\",\"value\":\"bbb\"}},{\"$ref\":\"$[0].127\\\\.0\\\\.0\\\\.1\\\\:1111\"},{\"name\":\"aaa\",\"value\":\"bbb\"}]",
                s);
        JSONArray objects = JSON.parseArray(s);
        Foo value1 = JSON.toJavaObject(objects.getJSONObject(1), Foo.class);
        assertNotNull(value1);
        assertEquals(value.getName(), value1.getName());
        assertEquals(value.getValue(), value1.getValue());
    }
iezvtpos

iezvtpos1#

做了几个实验,感觉是$ref标签的反向解析有点问题
用 String s = JSON.toJSONString(new Object[]{object, value, value2}, SerializerFeature.DisableCircularReferenceDetect); 这种模式可以先规避掉这个问题

a0zr77ik

a0zr77ik2#

根源是因为冒号: 在JSONPath解析时是有特殊含义的,是切片语法的组成部分。
“[start🔚step] 支持数组切片语法”

所以,针对这个问题,要么用SerializerFeature.DisableCircularReferenceDetect规避调JSONPath的解析出现,要么就由使用者自行保障JSONPath语义解析时不出现:的业务符号(也就是key不出现这个字符)

5kgi1eie

5kgi1eie3#

SerializerFeature.DisableCircularReferenceDetect 有点因噎废食啊

而且我列举的上面几个版本,得到的结果和异常都不一样,说明这几个版本之间都有改动这里的逻辑,但始终没有考虑支持这种情况。

相关问题