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:
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.)
Wenn Sie den Typ der Eigenschaft Json
in Person
von string
in JRaw
ändern können, erhalten Sie das gewünschte Ergebnis.
Alternativ können Sie die Eigenschaft string
beibehalten und eine Eigenschaft JRaw
hinzufügen, die als Proxy für die Serialisierung verwendet werden soll:
In beiden Fällen funktionieren Serialisierung und Deserialisierung wie gewünscht.
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:
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).
Ich bin nicht sicher, ob es eine Möglichkeit gibt, die Serialisierung zu überspringen. Hier ist eine Option zum einfachen Serialisieren und Deserialisieren.
%Vor%Tags und Links asp.net-web-api c# json serialization json.net