5

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

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

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

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

4

1 回答 1

3

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 将写出每个引用的所有名称和值......

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

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

于 2013-05-24T08:42:29.330 回答