Ich habe eine einfache Schlüssel- / Werteliste in JSON, die per POST an ASP.NET zurückgesendet wird. Beispiel:
{ "key1": "value1", "key2": "value2"}
Ich versuche nicht, in stark typisierte .NET-Objekte zu deserialisieren
Ich brauche einfach ein einfaches altes Wörterbuch (Of String, String) oder ein gleichwertiges (Hash-Tabelle, Dictionary (Of String, Object)) StringDictionary der alten Schule - verdammt, ein 2-D-Array von Strings würde für mich funktionieren.
Ich kann alles verwenden, was in ASP.NET 3.5 verfügbar ist, sowie das beliebte Json.NET (das ich bereits für die Serialisierung auf dem Client verwende).
Anscheinend verfügt keine dieser JSON-Bibliotheken über diese offensichtliche Fähigkeit, die Stirn zu schlagen - sie konzentrieren sich vollständig auf die reflexionsbasierte Deserialisierung über starke Verträge.
Irgendwelche Ideen?
Einschränkungen:
- Ich möchte keinen eigenen JSON-Parser implementieren
- ASP.NET 4.0 kann noch nicht verwendet werden
- Ich würde es vorziehen, mich von der älteren, veralteten ASP.NET-Klasse für JSON fernzuhalten
quelle
JavaScriptSerizlizer
wird in ASP.NET MVC verwendet und ist nicht mehr veraltet.Antworten:
Json.NET macht das ...
Weitere Beispiele: Serialisieren von Sammlungen mit Json.NET
quelle
dynamic
indem ich als Typ für die Werte verwende:JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);
[{key: "a", value: "1"}, {key: "b", value:"2"}]
Sie müssen Folgendes tun:var dict = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(json);
Ich habe festgestellt, dass .NET über eine integrierte Methode verfügt, um die JSON-Zeichenfolge in einen
Dictionary<String, Object>
Via-System.Web.Script.Serialization.JavaScriptSerializer
Typ in der 3.5-System.Web.Extensions
Assembly umzuwandeln. Verwenden Sie die MethodeDeserializeObject(String)
.Ich bin darauf gestoßen, als ich einen Ajax-Beitrag (über jquery) vom Inhaltstyp 'application / json' zu einer statischen .net-Seitenmethode verfasst habe, und habe festgestellt, dass die Methode (die einen einzelnen Parameter vom Typ hatte
Object
) dieses Wörterbuch auf magische Weise erhalten hat.quelle
var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer();
gefolgt vonDictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);
SomeData: ""
Für diejenigen, die im Internet suchen und auf diesen Beitrag stoßen, habe ich einen Blog-Beitrag über die Verwendung der JavaScriptSerializer-Klasse geschrieben.
Lesen Sie mehr ... http://procbits.com/2011/04/21/quick-json-serializationdeserialization-in-c/
Hier ist ein Beispiel:
quelle
Ich habe versucht, keine externe JSON-Implementierung zu verwenden, daher habe ich Folgendes deserialisiert:
quelle
System.Web.Script.Serialization
. Es funktioniert einfach. Ich konnte sogar "ungültige" JSON-ähnliche verwendenstring json = "{'id':13, 'value': true}";
.Ich hatte das gleiche Problem, also habe ich das selbst geschrieben. Diese Lösung unterscheidet sich von anderen Antworten, da sie auf mehrere Ebenen deserialisiert werden kann.
Senden Sie einfach eine JSON-Zeichenfolge an die Funktion deserializeToDictionary , um ein nicht stark typisiertes
Dictionary<string, object>
Objekt zurückzugeben.Alter Code
Beispiel: Dies gibt das
Dictionary<string, object>
Objekt einer Facebook-JSON-Antwort zurück.Prüfung
Aktualisieren
Meine alte Antwort funktioniert hervorragend, wenn die JSON-Zeichenfolge kein Array enthält. Dieser deserialisiert weiter in ein,
List<object>
wenn ein Element ein Array ist.Senden Sie einfach eine JSON-Zeichenfolge an die Funktion deserializeToDictionaryOrList , die ein nicht stark typisiertes
Dictionary<string, object>
Objekt oder zurückgibtList<object>
.quelle
is
undas
Operatoren sehr geholfen und meinen eigenen Code vereinfacht hat.Wenn Sie nach einem leichten Ansatz suchen, bei dem keine Referenzen hinzugefügt werden, funktioniert möglicherweise dieser Code, den ich gerade geschrieben habe (ich kann jedoch keine 100% ige Robustheit garantieren).
[Mir ist klar, dass dies gegen die OP-Einschränkung Nr. 1 verstößt, aber technisch gesehen haben Sie es nicht geschrieben, ich habe es getan]
quelle
System.RunTime.Serialization
die keine davon sind. Leider hängt JSON.NET davon ab es und somit kann es auch nicht verwendet werden. Vielen Dank an dexy für Ihre hervorragende Arbeit. Ich habe es gewagt, sie ein wenig zu verbessern, um Arrays von Arrays deserialisieren zu können. Den aktualisierten Code finden Sie in meiner Antwort hier .Ich musste nur ein verschachteltes Wörterbuch analysieren , wie
wo
JsonConvert.DeserializeObject
hilft nicht. Ich habe folgenden Ansatz gefunden:Mit
SelectToken
können Sie zum gewünschten Feld graben. Sie können sogar einen Pfad angeben"x.y.z"
, der weiter nach unten in das JSON-Objekt führen soll.quelle
System.Text.Json
Dies kann jetzt mit
System.Text.Json
der eingebauten Funktion erfolgen.net core 3.0
. Es ist jetzt möglich, JSON zu deserialisieren, ohne Bibliotheken von Drittanbietern zu verwenden.Auch im nu-get-Paket System.Text.Json verfügbar, wenn .Net Standard oder .Net Framework verwendet werden.
quelle
System.Text.Json
ist heutzutage der richtige Weg.Mark Rendle hat dies als Kommentar gepostet. Ich wollte es als Antwort posten, da es die einzige Lösung ist, die bisher funktioniert hat, um den Erfolg und die Fehlercodes zurückzugeben, die json aus der Antwort von Google reCaptcha resultiert.
Nochmals vielen Dank, Mark!
quelle
Bearbeiten: Dies funktioniert, aber die akzeptierte Antwort mit Json.NET ist viel einfacher. Lassen Sie diesen, falls jemand nur BCL-Code benötigt.
Es wird vom .NET Framework nicht sofort unterstützt. Ein grelles Versehen - nicht jeder muss in Objekte mit benannten Eigenschaften deserialisieren. Also rollte ich meine eigenen:
Angerufen mit:
Entschuldigung für die Mischung aus C # und VB.NET…
quelle
Ich habe den von jSnake04 und Dasun hier eingereichten Code hinzugefügt. Ich habe Code hinzugefügt, um Listen von Objekten aus
JArray
Instanzen zu erstellen . Es gibt eine bidirektionale Rekursion, aber da es auf einem festen, endlichen Baummodell funktioniert, besteht kein Risiko eines Stapelüberlaufs, es sei denn, die Daten sind massiv.quelle
Ich habe der anderen Antwort eine Prüfung auf Nullwerte im JSON hinzugefügt
Ich hatte das gleiche Problem, also schrieb ich das selbst. Diese Lösung unterscheidet sich von anderen Antworten, da sie auf mehrere Ebenen deserialisiert werden kann.
Senden Sie einfach einen JSON-String an die Funktion deserializeToDictionary , um ein nicht stark typisiertes
Dictionary<string, object>
Objekt zurückzugeben.Beispiel: Dies gibt das
Dictionary<string, object>
Objekt einer Facebook-JSON-Antwort zurück.Hinweis: Die Heimatstadt wird weiter in ein
Dictionary<string, object>
Objekt deserialisiert .quelle
d.Value is JObject
. Sie müssen nicht durch Reflexion gehen, um Typen zu überprüfen. Und mit demis
Operator müssen Sie nicht nach Null suchen. Es gibt false zurück, wenn das Objekt null ist.Es scheint, dass all diese Antworten hier nur davon ausgehen, dass Sie diese kleine Zeichenfolge aus einem größeren Objekt herausholen können ... für Leute, die einfach ein großes Objekt mit einem solchen Wörterbuch irgendwo in der Zuordnung deserealisieren möchten und das
System.Runtime.Serialization.Json
DataContract-System verwenden, hier eine Lösung:Eine Antwort auf gis.stackexchange.com hatte diesen interessanten Link . Ich musste es mit archive.org wiederherstellen, aber es bietet eine ziemlich perfekte Lösung: eine benutzerdefinierte
IDataContractSurrogate
Klasse, in der Sie genau Ihre eigenen Typen implementieren. Ich konnte es leicht erweitern.Ich habe jedoch einige Änderungen vorgenommen. Da die Originalquelle nicht mehr verfügbar ist, werde ich die gesamte Klasse hier posten:
Um der Klasse neue unterstützte Typen hinzuzufügen, müssen Sie nur Ihre Klasse hinzufügen, ihr die richtigen Konstruktoren und Funktionen zuweisen (siehe
SurrogateDictionary
ein Beispiel), sicherstellen, dass sie erbtJsonSurrogateObject
, und ihre Typzuordnung zumKnownTypes
Wörterbuch hinzufügen . Das mitgelieferte SurrogateDictionary kann als Grundlage für alleDictionary<String,T>
Typen dienen, wobei T ein beliebiger Typ ist, der korrekt deserialisiert.Es zu nennen ist wirklich einfach:
Beachten Sie, dass dieses Ding aus irgendeinem Grund Probleme mit der Verwendung von Schlüsselzeichenfolgen hat, die Leerzeichen enthalten. Sie waren einfach nicht in der endgültigen Liste vorhanden. Könnte einfach sein, dass es einfach gegen die JSON-Spezifikationen ist und die API, die ich anrief, schlecht implementiert wurde, wohlgemerkt; Ich weiß nicht. Wie auch immer, ich habe dies gelöst, indem ich sie durch Regex durch Unterstriche in den Json-Rohdaten ersetzt und das Wörterbuch nach der Deserialisierung repariert habe.
quelle
Dictionary<String,String>
. Ich habe ehrlich gesagt nie versucht, komplexe Typen mit diesem System zu deserialisieren.Basierend auf den obigen Kommentaren versuchen Sie es
JsonConvert.DeserializeObject<Dictionary<string,dynamic>>(json)
scheint sogar für komplexe Objekte und Listen zu funktionieren.
quelle
Ich habe dies gerade in RestSharp implementiert . Dieser Beitrag war hilfreich für mich.
Neben dem Code im Link ist hier mein Code. Ich bekomme jetzt eine Reihe
Dictionary
von Ergebnissen, wenn ich so etwas mache:Denken Sie an die Art von JSON, die Sie erwarten - in meinem Fall habe ich ein einzelnes Objekt mit mehreren Eigenschaften abgerufen. Im angehängten Link hat der Autor eine Liste abgerufen.
quelle
Mein Ansatz deserialisiert direkt auf IDictionary, ohne dazwischen JObject oder ExpandObject. Der Code verwendet den Konverter, der im Wesentlichen aus der im JSON.NET-Quellcode enthaltenen ExpandoObjectConverter-Klasse kopiert wird, jedoch IDictionary anstelle von ExpandoObject verwendet.
Verwendungszweck:
Code:
quelle
Sie könnten Tiny-JSON verwenden
quelle
Ein bisschen spät zum Spiel, aber keine der oben genannten Lösungen hat mich in Richtung einer reinen und einfachen .NET-Lösung geführt, keine json.net-Lösung. Also hier ist es, am Ende sehr einfach. Im Folgenden finden Sie ein ausführliches Beispiel für die Standard-.NET Json-Serialisierung. Das Beispiel enthält ein Wörterbuch sowohl im Stammobjekt als auch in den untergeordneten Objekten.
Die goldene Kugel ist diese Katze. Analysieren Sie die Einstellungen als zweiten Parameter für den Serializer:
Vollständiger Code unten:
quelle
Ärgerlicherweise müssen Sie, wenn Sie die Standardmodellbinder verwenden möchten, numerische Indexwerte wie einen Formular-POST verwenden.
Siehe den folgenden Auszug aus diesem Artikel http://msdn.microsoft.com/en-us/magazine/hh781022.aspx :
quelle
Ich würde vorschlagen,
System.Runtime.Serialization.Json
dass dies Teil von .NET 4.5 ist.Dann benutze es so:
quelle
Für alle, die versuchen, JSON in ein Wörterbuch zu konvertieren, nur um einen Wert daraus zu ziehen. Es gibt einen einfachen Weg mit
Newtongsoft.JSON
quelle