Wie kann ich ein reserviertes Schlüsselwort als Bezeichner in meiner JSON-Modellklasse verwenden?

8

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?

    
Michael Holman 23.05.2013, 02:32
quelle

3 Antworten

8

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%     
Radim Köhler 23.05.2013, 18:10
quelle
10

Sie können Schlüsselwörter in C # als Bezeichner verwenden, indem Sie @ vor ihnen voranstellen.

    
muratgu 23.05.2013 02:35
quelle
3

Die Klasse DropDownValues verwendet die camel-Konvention:

%Vor%

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 :

%Vor%

Und passen Sie JsonFormatter an, um Konventionenkonflikte zwischen C # - und json-Objekten zu vermeiden, wie unten dargestellt:

%Vor%     
Cuong Le 23.05.2013 02:40
quelle