是否有一个JavaScript(客户端)JSON库与JSON.NET(服务器端)很好地集成并支持"保留引用"功能?

Tri*_*nko 7 serialization json jsonserializer json.net circular-reference

JSON.NET通过使用以下设置保留所有引用来支持循环引用序列化:

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize;
settings.PreserveReferencesHandling = PreserveReferencesHandling.All;
Run Code Online (Sandbox Code Playgroud)

这允许以下代码无错误地运行,正确地序列化和反序列化对象及其自引用完整.

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 );
Run Code Online (Sandbox Code Playgroud)

jsondata字符串如下所示:

{"$id":"1","Name":"Default","Self":{"$ref":"1"}}
Run Code Online (Sandbox Code Playgroud)

问题是......如果没有可以解释这些引用的相应客户端JavaScript库,JSON.NET的这个特性是如何有用的,并且还支持编码这样的引用本身?

什么客户端库(例如JSON.stringify)使用"$ id"和"$ ref"字段支持此功能/编码?如果不存在,是否有一种已知的方法来添加对现有库的支持?

自己添加支持将是一个非常简单的双通过程.首先,反序列化整个字符串,并在创建每个对象时使用其"$ id"值作为键将其添加到字典中.当您遇到引用(仅包含"$ ref"属性的对象)时,您可以将其添加到object + fieldname列表中,您可以通过在已创建对象的最终字典中查找其键来返回以替换每个遇到的引用.

Shi*_*hah 2

有几个选项:

  1. Douglas Crockford 的原始 JSON 库有一个名为cycle.js 的插件,可以解决循环引用问题。另请参阅此答案,该答案具有解决引用的方法的增强版本:Resolve Circle References from JSON object
  2. Cereal可以更好地处理循环引用和对象图。
  3. CircularJSON非常小,而且正如它所说的那样。

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