Gibt es eine einfache Möglichkeit, JSON in .NET zu verwenden, um sicherzustellen, dass die Schlüssel in Kleinbuchstaben gesendet werden?
Im Moment benutze ich die Json.NET-Bibliothek von newtonsoft und benutze sie einfach
string loginRequest = JsonConvert.SerializeObject(auth);
In diesem Fall auth
handelt es sich nur um das folgende Objekt
public class Authority
{
public string Username { get; set; }
public string ApiToken { get; set; }
}
Das führt zu
{"Username":"Mark","ApiToken":"xyzABC1234"}
Gibt es eine Möglichkeit , um sicherzustellen , dass die username
und apitoken
Tasten als Klein kommen durch?
Ich möchte es String.ToLower()
natürlich nicht einfach durchgehen, weil die Werte für username
und apitoken
gemischt sind.
Mir ist klar, dass ich dies programmgesteuert tun und die JSON-Zeichenfolge manuell erstellen kann, aber ich benötige dies für ungefähr 20 JSON-Datenzeichenfolgen, und ich sehe, ob ich mir etwas Zeit sparen kann. Ich frage mich, ob es bereits erstellte Bibliotheken gibt, mit denen Sie Kleinbuchstaben für die Schlüsselerstellung erzwingen können.
Antworten:
Hierfür können Sie einen benutzerdefinierten Vertragsauflöser erstellen. Der folgende Vertragsauflöser konvertiert alle Schlüssel in Kleinbuchstaben:
Verwendung:
Wil Ergebnis in:
Wenn Sie immer mit serialisieren möchten, sollten Sie
LowercaseContractResolver
es in eine Klasse einschließen, um zu vermeiden, dass Sie sich wiederholen:Welches kann so verwendet werden:
ASP.NET MVC4 / WebAPI
Wenn Sie ASP.NET MVC4 / WebAPI verwenden, können Sie eine
CamelCasePropertyNamesContractResolver
Bibliothek von Newtonsoft.Json verwenden, die standardmäßig enthalten ist.quelle
CamelCasePropertyNamesContractResolver
. Jetzt habe ich festgestellt, dass diesSystem.Net.Http.Formatting.JsonContractResolver
die Standardeinstellung in WebAPI ist und diese Klasse intern ist. Am Ende schreibe ich mit Kameletui umJsonContractResolver
. Jemand hat berichtet, dass dies öffentlich ist. Aspnetwebstack.codeplex.com/workitem/228CamelCasePropertyNamesContratResolver
Transformieren Sie die Eigenschaften nicht in Kleinbuchstaben, sondern nur in das erste Zeichen.quelle
In Json.NET 9.0.1 und höher kann mithilfe einer benutzerdefinierten Funktion sichergestellt werden, dass alle Eigenschaftsnamen in Kleinbuchstaben konvertiert werden
NamingStrategy
. Diese Klasse extrahiert die Logik für die algorithmische Neuzuordnung von Eigenschaftsnamen aus dem Vertragsauflöser zu einem separaten, leichtgewichtigen Objekt, das festgelegt werden kannDefaultContractResolver.NamingStrategy
. Dadurch wird die Notwendigkeit vermieden, eine benutzerdefinierteContractResolver
Version zu erstellen, und es kann daher einfacher sein, diese in Frameworks zu integrieren, die bereits über eigene Vertragsauflöser verfügen.Definieren Sie
LowercaseNamingStrategy
wie folgt:Dann serialisieren Sie wie folgt:
Anmerkungen -
Durch
string.ToLowerInvariant()
die Verwendung wird sichergestellt, dass in allen Ländereinstellungen derselbe Vertrag generiert wird.Um zu steuern , ob überschriebene Eigenschaftsnamen, Dictionary - Schlüssel und Erweiterungsdatennamen werden klein geschrieben, können Sie einstellen
NamingStrategy.OverrideSpecifiedNames
,NamingStrategy.ProcessDictionaryKeys
oderNamingStrategy.ProcessExtensionDataNames
(Json.NET 10.0.1 und höher)true
.Möglicherweise möchten Sie den Vertragsauflöser für eine optimale Leistung zwischenspeichern .
Wenn Sie keinen Zugriff auf die Serializer-Einstellungen in Ihrem Framework haben, können Sie a
NamingStrategy
direkt wie folgt auf Ihr Objekt anwenden :Ändern Sie nicht das
NamingStrategy
vonCamelCasePropertyNamesContractResolver
. Dieser Vertragsauflöser teilt Typinformationen global für alle Instanzen. Daher kann das Ändern einer Instanz unerwartete Nebenwirkungen haben.quelle
Sie können "JsonProperty" verwenden:
Verwendung:
quelle
Für mich habe ich eine Kombination aus einigen der anderen Antworten verwendet und am Ende diese erhalten
war näher an einer Lösung für das, was ich suchte, da ich nicht meine eigene erstellen wollte
quelle