Ich habe noch nie zuvor eine Web-API verwendet, aber ich brauche einen Webdienst, der JSON-Objekte akzeptiert / zurückgibt, und das scheint mir eine vernünftige Sache zu sein. Es sah ziemlich einfach aus (wenn nicht ein bisschen Overkill für meine Zwecke), aber eine Datenstruktur, mit der ich umgehen muss, sieht ungefähr so aus:
%Vor%Und ich machte ein Model-Objekt:
%Vor%Problem ist, dass der Standardwert ein geschütztes Schlüsselwort ist. Es muss einen Weg geben, um das zu umgehen, richtig?
Ich würde vorschlagen, anders zu gehen. Behalten Sie Ihr C # -Objektmodell so weit wie möglich standard (Ich würde @
sign und C# keywords
nicht als Eigenschaftsnamen verwenden) .
Wir können die serialisierte (JSON) Welt und die C # -Objekte trennen, indem wir nur die Json.NET-Funktionen verwenden.
Eine der einfachsten Funktionen ist die Dekoration mit Attribut:
%Vor% In diesem Fall müssen wir auf Newtonsoft.Json im Projekt verweisen. Wenn es POCO sein muss, können wir CustomResolver
abgeleitet von DefaultContractResolver
einführen und diese Konvertierungen dort definieren ...
Aber Trennung von Bedenken in diesem Fall ist eine etwas reinere Lösung, würde ich sagen
EDIT: JSON Contract Resolver Entwurf (siehe Kommentare)
Wichtiger Hinweis: Newtonsoft.Json ist Teil der Web-API. Es ist nicht nur eine Open Source, sondern sogar MS Team wettet darauf als Core JSON Serializer.
1) Newtonsoft.Json (als Teil der Web.API) ist bereits in Ihrer Lösung installiert. Sie müssen also nicht separat herunterladen (nugget). Es wäre immer in deinem packages
-Ordner. Um das Attribut zu verwenden, fügen Sie einfach die Referenz hinzu. Es ist da ...
2) Es gibt einen kleinen Entwurf, wie man das Attribut stuff macht, während man das POCO beibehält . Wie ich versucht habe, erklären Sie hier: POCO's, Verhalten und Peristance Igorance , um POCO zu behalten (zB profitieren wir von der geschichteten Architektur Mit NHibernate auf einer Datenschicht können Attribute durch Contract Resolver
ersetzt werden. Unsere POCO-Bibliothek muss nichts referenzieren
Wir müssen nur die Serviceebene erweitern:
%Vor% Auf diese Weise haben wir serailizer dieselben Informationen bereitgestellt wie mit [JsonPropertyAttribute]
.
Jetzt müssen wir es nur benutzen. Es gibt viele Möglichkeiten (z. B. global), aber wir können dies nur für einen Controller tun:
%Vor% Die Klasse DropDownValues
verwendet die camel-Konvention:
Sie können das Präfix @
verwenden, um passby zu sein, aber es folgt immer noch nicht den C # -Kodierungskonventionen.
Die bessere Lösung, die Sie sowohl reserviertes Schlüsselwort vermeiden als auch C # -Kodierungskonventionen verwenden können, ist die Verwendung von CamelCasePropertyNamesContractResolver
:
Und passen Sie JsonFormatter
an, um Konventionenkonflikte zwischen C # - und json-Objekten zu vermeiden, wie unten dargestellt:
Tags und Links asp.net-mvc asp.net-web-api .net c#