是否有一个JavaScript(客户端)JSON库可以很好地与JSON.NET(服务器端)集成并支持;“保留引用”;特征?

是否有一个JavaScript(客户端)JSON库可以很好地与JSON.NET(服务器端)集成并支持;“保留引用”;特征?,json,serialization,json.net,circular-reference,jsonserializer,Json,Serialization,Json.net,Circular Reference,Jsonserializer,JSON.NET通过使用以下设置保留所有引用来支持循环引用序列化: JsonSerializerSettings settings = new JsonSerializerSettings(); settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; settings.PreserveReferencesHandling = PreserveReferencesHandling.All; 这使得下面的代码可以在没有错误

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 );
问题是。。。如果没有相应的客户端JavaScript库来解释这些引用,并且还支持对这些引用本身进行编码,那么JSON.NET的这一特性有何用处

哪个客户端库(例如JSON.stringify)支持使用“$id”和“$ref”字段进行此功能/编码?如果不存在,是否有已知的方法向现有库添加支持?

我自己添加支持将是一个非常简单的两步过程。首先,反序列化整个字符串,并在创建每个对象时使用其“$id”值作为键将其添加到字典中。当遇到引用(仅由“$ref”属性组成的对象)时,可以将其添加到对象+字段名列表中,您可以通过在最终创建的对象字典中查找其键来返回以替换遇到的每个引用。

有几个选项:

  • Douglas Crockford最初的JSON库中有一个插件,名为解析循环引用。另请参阅此答案,其中包含解析引用的方法的增强版本:
  • 它可以更好地处理循环引用和对象图
  • 它非常小,而且完全按照它说的做

  • 话虽如此,我可能会重构我的设计以避免循环引用,因为JSON通常是核心组件,您可能希望使用经过良好测试和支持的主流库。避免循环引用的一种方法是创建轻量级垫片对象,并将其序列化。或者实现覆盖序列化行为的自定义接口(如果您有权访问类)。您甚至可以使用反射将其自动化,以避免使用循环引用的属性。

    我已经到处寻找解决方案。似乎有一种叫做“dojo”(dojo)的东西也有这种支持,但它也是服务器端的,它似乎没有在id字段中包含“$”,因此它甚至与JSON.NET处理引用编码的方式不一致。JSON 3序列化程序也缺乏循环引用支持,并且会抛出错误。代码注释为“//循环结构不能由JSON序列化。stringify”此问题包含以下答案:
    {"$id":"1","Name":"Default","Self":{"$ref":"1"}}