2013-05-02 2 views
7

Angenommen, ich habe diese Berechtigungen mit diesen Beziehungen: Dies ist nur ein fiktives Beispiel, und nicht meine aktuellen Entitäten.Legen Sie eine maximale Tiefe der JSON-Serialisierung in .NET Web API

  • Course
  • Benutzer
  • Neuigkeiten

Kurse haben viele Benutzer haben Benutzer viele Kurse

Kurse viele Neuigkeiten hat, Neuigkeiten hat viele Kurse

Benutzer hat viele NewsPosts, NewsPosts hat viele Benutzer

Ich benutze Entity Framework-Code zuerst mit .NET Web API, die Entitäten in Form von JSON zurücksendet. Wenn ich versuche, einen Kurs zu erhalten, sendet er ein JSON-Ergebnis mit den Relationen der Entitäten zurück, was in Ordnung ist, aber ich möchte ein Limit festlegen, wie viele Ebenen es serialisiert, so dass es nicht alle Relationen über die erste serialisiert oder zweite Ebene.

GET Kurs/würde serialisiert werden:

{ 
    "Users":[{ 
       "id":1, 
       "newsPosts": [{ 
           "id":1, 
           "message":"foo" 
          }] 
      }], 
    "newsPosts":[{ 
       "id":2, 
       "message":"bar" 
       }] 

    } 

Was ich möchte ist nur 1 oder vielleicht 2 Ebenen serialisiert werden, so dass das Ergebnis wäre:

{ 
    "Users":[{ 
       "id":1, 
       "newsPosts": [] 
      }], 
    "newsPosts":[{ 
       "id":2, 
       "message":"bar" 
       }] 

    } 

Ich habe hinzugefügt a:

json.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore; 

Dies ist zum Entfernen der Referencelooping.

Kurz gesagt: Gibt es eine Möglichkeit, eine maximale Anzahl von Knoten zu serialisieren?

+2

mögliche Duplikate von [Wie wird ein JSON-Objekt in C# in eine bestimmte Tiefe serialisiert oder deserialisiert?] (Http: // stackoverflow.com/questions/10453127/how-to-serialize-oder-deserialize-a-json-Objekt-zu-bestimmten-Tiefe-in-c) –

+1

Ein benutzerdefinierter JsonWriter und ein benutzerdefinierter ContractResolver scheint der richtige Weg zu sein. Danke, dass Sie das Duplikat bemerkt haben. –

Antwort

0

Ist das nicht einfach eine Frage, wie Sie die Daten erstellen, die Sie von Ihrer Get-Funktion senden?

Ich meine der JSON Serializer macht seine Arbeit, indem er alle Daten serialisiert, die Sie ihm geben, entfernen Sie einfach die Daten, oder schließen Sie es nicht ein, und es wird nicht serialisiert.

Wenn es feiner Tuning ist Sie suchen nach einem benutzerdefinierten JsonWriter ist, was Sie wollen, den Link von Alex Filipovici geschrieben geben gute Details, was zu tun, um das zu erreichen.

-1

Ich empfehle die Zuordnung Ihrer Domänenklasse (n) zu benutzerdefinierten DTO-Objekten mit etwas wie AutoMapper, und dann diese für die Serialisierung übergeben.

+0

Es ist nicht empfehlenswert, etwas zu empfehlen, ohne eine Frage zu stellen. Z.B. kann da sein json wird für die Verwendung in generischen Kontexten verwendet werden: wie Statusbehandlung, Caching, Protokollierung ... –

-1

Ich bin nicht sehr vertraut mit Web-API, aber es scheint, als ob Sie eine benutzerdefinierte MediaTypeFormatter, die JavaScriptSerializer verwenden, die eine Eigenschaft zum Festlegen einer Rekursion begrenzen möchten.

MSDN - JavaScriptSerializer.RecursionLimit Property

Eine weitere Option ist, um eine benutzerdefinierte Formatierer zu machen, die JSON.NET verwendet, die die gleiche Art von Optionen.

+0

Ja. Trotzdem möchte ich JSON.NET verwenden. Es scheint so, als ob es mehr Funktionen auf json.NET als javascriptserializer gäbe. Also ja, scheint, als ob ich für die andere Option gehen möchte! Gefunden einen Vergleich hier: http://json.codeplex.com/ –

+0

JavaScriptSerializer.RecursionLimit funktioniert nicht dafür. JavaScriptSerializer löst eine Ausnahme aus, wenn das Limit erreicht wurde. –

Verwandte Themen