是否有与 JSON.NET(服务器端)良好集成并支持“保留引用”功能的 JavaScript(客户端)JSON 库?
Posted
技术标签:
【中文标题】是否有与 JSON.NET(服务器端)良好集成并支持“保留引用”功能的 JavaScript(客户端)JSON 库?【英文标题】:Is there a JavaScript (client-side) JSON library that integrates well with JSON.NET (server-side) and supports the "preserve references" feature? 【发布时间】:2013-08-06 14:44:39 【问题描述】: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”属性组成的对象)时,您可以将其添加到对象+字段名列表中,您可以通过在创建对象的最终字典中查找其键来返回以替换每个遇到的引用.
【问题讨论】:
我到处寻找解决方案。似乎有一种叫做“dojo”(sitepen.com/blog/2008/06/17/json-referencing-in-dojo)的东西也有这种支持,但它也是服务器端的,它似乎没有在 id 字段中包含“$”,所以它甚至不一致JSON.NET 处理引用编码的方式。 JSON 3 序列化程序bestiejs.github.io/json3 也缺乏循环引用支持,会抛出错误。代码注释是'//循环结构不能被JSON.stringify
序列化。'
此问题包含答案:***.com/questions/13782052/…
【参考方案1】:
有几个选项:
-
Douglas Crockford 的原始 JSON 库有一个名为 cycle.js 的插件,可以解析循环引用。另请参阅此答案,它具有解决引用的方法的增强版本:Resolve circular references from JSON object。
Cereal 更好地处理循环引用和对象图。
CircularJSON 非常小,完全按照它所说的去做。
话虽如此,我可能会重构我的设计以避免循环引用,因为 JSON 通常是核心组件,您可能希望使用经过良好测试和支持的主流库。避免循环引用的一种方法是创建轻量级 shim 对象并将它们序列化。或者实现覆盖序列化行为的自定义接口(如果您有权访问类)。您甚至可以使用反射将其自动化,以避免具有循环引用的属性。
【讨论】:
以上是关于是否有与 JSON.NET(服务器端)良好集成并支持“保留引用”功能的 JavaScript(客户端)JSON 库?的主要内容,如果未能解决你的问题,请参考以下文章