JSON.NET 通过使用以下设置保留所有引用来支持循环引用序列化:
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
这允许以下代码无错误地运行,正确地序列化和反序列化对象,并且其自引用完好无损。
public class SelfReferencingClass
{
public string Name;
public SelfReferencingClass Self;
public SelfReferencingClass() {Name="Default"; Self=this;}
}
SelfReferencingClass s = new SelfReferencingClass();
string jsondata = JsonConvert.SerializeObject( d, settings );
s = JsonConvert.DeserializeObject<SelfReferencingClass>( jsondata, settings );
jsondata 字符串如下所示:
{"$id":"1","Name":"Default","Self":{"$ref":"1"}}
问题是……如果没有相应的客户端 JavaScript 库可以解释这些引用,并且还支持对这些引用本身进行编码,那么 JSON.NET 的这个特性有什么用?
哪个客户端库(例如 JSON.stringify)支持使用“$id”和“$ref”字段的此功能/编码?如果不存在,是否有已知的方法可以向现有库添加支持?
自己添加支持将是一个非常简单的两遍过程。首先,反序列化整个字符串,并在创建每个对象时将其添加到字典中,使用其“$id”值作为键。当您遇到引用(仅由“$ref”属性组成的对象)时,您可以将其添加到对象+字段名列表中,您可以通过在创建对象的最终字典中查找其键来返回以替换每个遇到的引用.