Wie deaktiviere ich die Objektreferenzerstellung im Newtonsoft JSON-Serializer?

8

Ich habe meine ASP.NET MVC-Anwendung so geändert, dass sie den Newtonsoft JsonSerializer für unsere JSON-Serialisierung verwendet:

%Vor%

Dies erzeugt ein JSON mit den Eigenschaften $ id und $ ref und entfernt dann doppelte Objekte aus dem JSON. Ich weiß, dass es ein Feature ist, das großartig ist, aber die Clients, die dieses JSON lesen, können das Interpretieren dieser Referenzen nicht unterstützen und erwarten, dass vollständige Objekte vorhanden sind. Ich habe versucht, die Eigenschaft PreserveReferencesHandling auf dem JsonSerializerSettings auf jeden möglichen Wert zu setzen und es scheint keinen Unterschied zu machen.

Wie kann ich die Erstellung der Eigenschaften $ id und $ ref deaktivieren und den Newtonsoft-Serializer dazu veranlassen, das gesamte Objektdiagramm auszugeben?

BEARBEITEN : Hier ist eine Beispiel-C # -Klasse, der JSON, den ich erwarte, und der JSON, der vom Newtonsoft-Serializer erstellt wurde:

%Vor%

JSON Ich erwarte:

%Vor%

JSON, das vom Newtonsoft-Serializer erstellt wurde (beachten Sie den hinzugefügten $ id-Parameter in MainImage und das referenzierte Objekt, das vollständig durch einen $ ref-Parameter ersetzt wird):

%Vor%

Ich verstehe, dass die Newtonsoft-Version besser ist (es ist DRYer), aber der Client, der diese JSON-Ausgabe liest, versteht nicht, was $ ref bedeutet.

    
user2719100 11.10.2013, 01:48
quelle

1 Antwort

19

Wenn ich JSON.Net 5.0.6 (die neueste Version in NuGet) in seiner Standardkonfiguration verwende, sehe ich das angezeigte Verhalten nicht. Hier ist das genaue Programm, das ich zum Testen verwende:

%Vor%

Und hier ist die Ausgabe:

%Vor%

Wenn ich jedoch eine Instanz von JsonSerializerSettings erstelle, setze den Wert von PreserveReferencesHandling auf Objects und übergebe diese Einstellungen wie folgt an den Serializer:

%Vor%

... dann sehe ich die Referenz-IDs, über die Sie sprechen:

%Vor%

Wenn ich das gleiche mache, aber PreserveReferencesHandling auf None setze, geht es zurück zur ursprünglichen Ausgabe. Du hast gesagt, dass du jeden anderen Wert von PreserveReferencesHandling ausprobiert hast. Wie machst du das in deinem Code? In Ihrer Frage sehe ich keine Einstellungen in den Serializer. Wenn Sie versuchen, das eigenständige Testprogramm oben auszuführen, erhalten Sie die gleiche Ausgabe?

AKTUALISIEREN

Ich sehe aus Ihren Kommentaren, dass Ihre Klassen mit [DataContract(IsReference = true)] dekoriert sind, das erklärt, warum Sie sehen, dass die Referenzinformationen zu Ihrem JSON hinzugefügt werden. In der JSON.Net-Dokumentation zu Serialisierungsattributen :

  

Neben den integrierten Json.NET-Attributen sucht Json.NET auch nach dem SerializableAttribute (wenn IgnoreSerializableAttribute auf DefaultContractResolver auf false gesetzt ist) DataContractAttribute , DataMemberAttribute und NonSerializedAttribute ... bei der Festlegung, wie JSON serialisiert und deserialisiert werden soll.

Es sagt auch das:

  

Hinweis

     

Json.NET-Attribute übernehmen den Vorsitz über Standard-.NET-Serialisierungsattribute, z. Wenn sowohl JsonPropertyAttribute als auch DataMemberAttribute für eine Eigenschaft vorhanden sind und beide den Namen anpassen, wird der Name aus JsonPropertyAttribute verwendet.

So scheint es, dass die Lösung für Ihr Problem einfach ist: Fügen Sie einfach [JsonObject(IsReference = false)] zu Ihren Klassen wie folgt hinzu:

%Vor%

Dies ermöglicht Ihnen, Ihre WCF-Attribute beizubehalten, überschreibt jedoch das Referenzverhalten, wenn es an der Zeit ist, zu JSON zu serialisieren. Wenn Sie das Beispielprogramm in dieser Konfiguration erneut ausführen, behebt es das Problem.

    
Brian Rogers 11.10.2013, 20:25
quelle

Tags und Links