如何通过引用以前的元素来停止.net JSON序列化?

Ant*_*ain 5 .net c# json asp.net-mvc-4 asp.net-web-api

我使用MVC 4.5的MVC/Web API来提供JSON服务.

一切正常,直到需要公开具有一定量重复数据的大型JSON结果.

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

虽然我很欣赏它的效率节省,但我们的客户端应用程序无法使用这种格式

Rad*_*ler 3

Json.NET 有一个设置可以发挥这种魔力......它是“保留对象引用” ,这里是文档的链接:

我想说,您所经历的与文档中的示例类似

一些摘录 (但是,请参阅文档以了解更多详细信息)

让我们有两个人一起收藏吧。有一个小技巧:PreserveReferencesHandling这样设置

string json = JsonConvert.SerializeObject(
  people, 
  Formatting.Indented,
  new JsonSerializerSettings 
  { 
     PreserveReferencesHandling = PreserveReferencesHandling.Objects 
  });
Run Code Online (Sandbox Code Playgroud)

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

[
  {
    "$id": "1",
    "Name": "James",
    "BirthDate": "1983-03-08T00:00Z",
    "LastModified": "2012-03-21T05:40Z"
  },
  {
    "$ref": "1"
  }
]
Run Code Online (Sandbox Code Playgroud)

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

new JsonSerializerSettings 
{ 
    PreserveReferencesHandling = PreserveReferencesHandling.None;
}
Run Code Online (Sandbox Code Playgroud)

正如文档中所示:

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

所以这应该再次成为默认设置

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