gpt4 book ai didi

json - 是否有与 JSON.NET(服务器端)良好集成并支持 "preserve references"功能的 JavaScript(客户端)JSON 库?

转载 作者:行者123 更新时间:2023-12-04 08:49:14 25 4
gpt4 key购买 nike

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”属性组成的对象)时,您可以将其添加到对象+字段名列表中,您可以通过在已创建对象的最终字典中查找其键来返回以替换每个遇到的引用.

最佳答案

有几个选项:

  • Douglas Crockford 的原始 JSON 库有一个名为 cycle.js 的插件。解决了循环引用。另请参阅此答案,它具有解决引用的方法的增强版本:Resolve circular references from JSON object .
  • Cereal它可以更好地处理循环引用和对象图。
  • CircularJSON它非常小,并且完全按照它所说的那样做。

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

    关于json - 是否有与 JSON.NET(服务器端)良好集成并支持 "preserve references"功能的 JavaScript(客户端)JSON 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18065857/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com