5

MVC 4.5 の MVC/Web API を使用して JSON サービスを提供しています。

一定量の繰り返しデータを含む大きな JSON 結果を公開する必要があるまでは、すべてうまく機能します。

私が何を意味するのかよくわからない人のために、たとえば、本のリストがあり、それぞれに完全な著者データがある場合、.net は、データを複製する代わりに、同じ著者の 2 番目のバージョンを前のバージョンを参照するように変更します。 . これらの場合、$X 参照を使用します。ここで、X は参照するアイテムのインデックスです。

効率の節約には感謝していますが、この形式はクライアント アプリでは使用できません。

4

1 に答える 1

3

Json.NETには、その魔法を実行できる設定があります...それはPreserving Object Referencesであり、ドキュメントへのリンクは次のとおりです。

あなたが経験していることは、ドキュメントの例に似ていると思います

いくつかの抜粋 (ただし、詳細についてはドキュメントを参照してください) :

2人でコレクションしましょう。ちょっとしたトリックで: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 は遭遇するすべてのオブジェクトを値でシリアル化します。リストに 2 つの Person 参照が含まれていて、両方の参照が同じオブジェクトを指している場合、JsonSerializer は各参照のすべての名前と値を書き出します...

したがって、これは再びデフォルト設定にする必要があります

別の興味深い読み物: Serializing Circular References

于 2013-05-24T08:42:29.330 に答える