我如何阻止.net JSON序列化引用以前的元素

本文关键字:元素 引用 序列化 何阻止 net JSON | 更新日期: 2023-09-27 18:15:21

我使用MVC/Web API从MVC 4.5提供JSON服务。

所有工作都很好,直到需要公开一个具有一定数量重复数据的大型JSON结果。

对于那些不确定我的意思的人,例如,如果我有一个图书列表,其中每本都有完整的作者数据,.net将更改同一作者的第二个版本以引用前一个,而不是重复数据。在这些情况下,它使用$X引用,其中X是要引用的项的索引。

虽然我欣赏它的效率节省,这种格式不能被我们的客户端应用程序使用

我如何阻止.net JSON序列化引用以前的元素

Json。NET有一个设置可以做到这一点。它是保存对象引用,这里是文档的链接:

我想说,你所经历的,和文档

中的一个例子很相似。

一些摘录(但是,请参阅文档了解更多细节):

让我们有一个集合人和两个人。有一个小技巧:像这样设置PreserveReferencesHandling

string json = JsonConvert.SerializeObject(
  people, 
  Formatting.Indented,
  new JsonSerializerSettings 
  { 
     PreserveReferencesHandling = PreserveReferencesHandling.Objects 
  });

我们可以得到这样的结果:

[
  {
    "$id": "1",
    "Name": "James",
    "BirthDate": "1983-03-08T00:00Z",
    "LastModified": "2012-03-21T05:40Z"
  },
  {
    "$ref": "1"
  }
]

我们所看到的,很可能就是你所经历的。所以PreserveReferencesHandling.Objects似乎是你代码的设置。因此,尝试显式地将其设置为None,如下所示:

new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.None;
}

和文档中一样:

…默认为Json。. NET将序列化它遇到的所有对象价值。如果一个列表包含两个Person引用,并且两个引用指向同一个对象,那么JsonSerializer就会写出所有的对象每个引用的名称和值…

所以这应该是默认的设置又是

另一个有趣的阅读:序列化循环引用