Json.NET - verhindert das erneute Serialisieren einer bereits serialisierten Eigenschaft [duplizieren]

8

In einer ASP.NET-Web-API-Anwendung enthalten einige der Modelle, mit denen ich arbeite, einen Teil Ad-hoc-JSON, der nur auf der Client-Seite nützlich ist. Auf dem Server geht es einfach als String in eine relationale Datenbank ein und aus. Leistung ist der Schlüssel, und es scheint sinnlos, die JSON-String-Server-Seite überhaupt zu verarbeiten.

Stellen Sie sich also in C # ein Objekt wie dieses vor:

%Vor%

Standardmäßig wird Json.NET dieses Objekt wie folgt serialisieren:

%Vor%

Ich möchte Json.NET anweisen können, anzunehmen, dass die Eigenschaft Json bereits eine serialisierte Repräsentation ist, daher sollte sie nicht erneut serialisiert werden, und der resultierende JSON sollte so aussehen:

%Vor%

Idealerweise funktioniert dies in beiden Richtungen, d. h. beim POST der JSON-Darstellung wird es automatisch zur C # -Darstellung oben deserialisiert.

Was ist der beste Mechanismus, um dies mit Json.NET zu erreichen? Benötige ich eine benutzerdefinierte JsonConverter ? Gibt es einen einfacheren attributbasierten Mechanismus? Effizienz zählt; Der springende Punkt ist, den Serialisierungs-Overhead zu überspringen, der könnte etwas von einer Mikro-Optimierung sein, aber aus Gründen des Arguments nehmen wir an, dass es nicht ist. (Es werden möglicherweise große Listen mit sperrigen Json -Eigenschaften zurückgegeben.)

    
Todd Menier 29.09.2015, 17:30
quelle

3 Antworten

13

Wenn Sie den Typ der Eigenschaft Json in Person von string in JRaw ändern können, erhalten Sie das gewünschte Ergebnis.

%Vor%

Alternativ können Sie die Eigenschaft string beibehalten und eine Eigenschaft JRaw hinzufügen, die als Proxy für die Serialisierung verwendet werden soll:

%Vor%

In beiden Fällen funktionieren Serialisierung und Deserialisierung wie gewünscht.

    
Mike Hixson 29.09.2015, 18:18
quelle
1

Ich bin mir nicht sicher, ob das genau sinnvoll ist, aber Sie könnten einen benutzerdefinierten Konverter wie diesen erstellen:

%Vor%

Wenn Sie nun Ihre Json Eigenschaft mit [JsonConverter(typeof(StringToJsonConverter))] dekorieren, können Sie das tun:

%Vor%

Und nimm das:

%Vor%

Hier ist eine Geige

Eine Anmerkung, aber in meiner Geige, bin ich rund Auslösen der Serialisierung und Deserialisierung, aber die Werte in der Eigenschaft Json sind nicht genau gleich. Warum? Weil die zusätzlichen Leerzeichen um Ihre geschweiften Klammern in diesem Prozess entfernt wurden. Natürlich sind sie nicht wichtig (oder sollten nicht).

    
Matt Burland 29.09.2015 17:53
quelle
0

Ich bin nicht sicher, ob es eine Möglichkeit gibt, die Serialisierung zu überspringen. Hier ist eine Option zum einfachen Serialisieren und Deserialisieren.

%Vor%     
XtremeBytes 29.09.2015 18:01
quelle