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());
}
3条答案
按热度按时间iezvtpos1#
做了几个实验,感觉是$ref标签的反向解析有点问题
用 String s = JSON.toJSONString(new Object[]{object, value, value2}, SerializerFeature.DisableCircularReferenceDetect); 这种模式可以先规避掉这个问题
a0zr77ik2#
根源是因为冒号: 在JSONPath解析时是有特殊含义的,是切片语法的组成部分。
“[start🔚step] 支持数组切片语法”
所以,针对这个问题,要么用SerializerFeature.DisableCircularReferenceDetect规避调JSONPath的解析出现,要么就由使用者自行保障JSONPath语义解析时不出现:的业务符号(也就是key不出现这个字符)
5kgi1eie3#
SerializerFeature.DisableCircularReferenceDetect
有点因噎废食啊而且我列举的上面几个版本,得到的结果和异常都不一样,说明这几个版本之间都有改动这里的逻辑,但始终没有考虑支持这种情况。