fastjson 嵌套较深的引用,$ref的值在'$'与'['之间包含属性名,导致反序列化不成功

mm5n2pyu  于 2021-11-27  发布在  Java
关注(0)|答案(1)|浏览(465)

下面这三个对象,Family包含了List,Parent包含了Child.

public class Family {

	List parents = new ArrayList();

	public List getParents() {
		return parents;
	}

	public void setParents(List parents) {
		this.parents = parents;
	}

}
---------------------------------------------------------------
public class Parent {

	private String name;

	private Child child;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Child getChild() {
		return child;
	}

	public void setChild(Child child) {
		this.child = child;
	}

}
-------------------------------------------------------------
public class Child {

	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

}

在构造Family这个对象时,故意将两个Parent的Child设置为同一个示例,使得序列化后的结果,包含$ref:

public static void main(String[] args) {
		ParserConfig.getGlobalInstance().addAccept("test.Family");
		ParserConfig.getGlobalInstance().addAccept("test.Parent");
		ParserConfig.getGlobalInstance().addAccept("test.Child");

		Child child = new Child();
		child.setName("孩子");

		List parents = new ArrayList();

		Parent father = new Parent();
		father.setName("爸爸");
		father.setChild(child);
		parents.add(father);

		Parent mother = new Parent();
		mother.setName("妈妈");
		mother.setChild(child);
		parents.add(mother);

		Family family = new Family();
		family.setParents(parents);

		String jsonString = JSON.toJSONString(family, SerializerFeature.WriteClassName);
		System.out.println(jsonString);
		JSON.parseObject(jsonString, List.class);

	}

序列化的结果如下:(注意$ref后面的值在$和[0]之间有个parents)
{"@type":"test.Family","parents":[{"child":{"name":"孩子"},"name":"爸爸"},{"child":{"$ref":"$.parents[0].child"},"name":"妈妈"}]}
抛出异常:

Exception in thread "main" com.alibaba.fastjson.JSONException: expect '[', but {, pos 1, line 1, column 2{"@type":"test.Family","parents":[{"child":{"name":"孩子"},"name":"爸爸"},{"child":{"$ref":"$.parents[0].child"},"name":"妈妈"}]}
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseArray(DefaultJSONParser.java:721)
	at com.alibaba.fastjson.serializer.CollectionCodec.deserialze(CollectionCodec.java:126)
	at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:688)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:396)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:300)
	at com.alibaba.fastjson.JSON.parseObject(JSON.java:573)
	at test.App.main(App.java:37)

测试的完整代码请见压缩包:
deepref.zip

ct2axkht

ct2axkht1#

最后一行改为JSON.parseObject(jsonString);JSON.parseObject(jsonString, test.Family.class);后均正常运行

相关问题