我使用 MVC 4.5 中的 MVC/Web API 来提供 JSON 服务。
一切正常,直到需要公开具有一定数量重复数据的大型 JSON 结果。
对于那些不确定我的意思的人,例如,如果我有一个书籍列表,其中每个都有完整的作者数据,.net 将更改同一作者的第二个版本以引用前一个,而不是复制数据. 在这些情况下,它使用 $X 引用,其中 X 是要引用的项目的索引。
虽然我很欣赏它的效率节省,但我们的客户端应用程序无法使用这种格式
我使用 MVC 4.5 中的 MVC/Web API 来提供 JSON 服务。
一切正常,直到需要公开具有一定数量重复数据的大型 JSON 结果。
对于那些不确定我的意思的人,例如,如果我有一个书籍列表,其中每个都有完整的作者数据,.net 将更改同一作者的第二个版本以引用前一个,而不是复制数据. 在这些情况下,它使用 $X 引用,其中 X 是要引用的项目的索引。
虽然我很欣赏它的效率节省,但我们的客户端应用程序无法使用这种格式
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 将写出每个引用的所有名称和值......
所以这应该再次成为默认设置
另一个有趣的阅读: 序列化循环引用