860 Stimmen

Wie kann ich JSON in ein einfaches Dictionary<string,string> in ASP.NET deserialisieren?

Ich habe eine einfache Schlüssel/Wert-Liste in JSON, die über POST an ASP.NET zurückgesendet wird. Beispiel:

{ "key1": "value1", "key2": "value2"}

ICH VERSUCHE NICHT, IN STARK GETYPTE .NET-OBJEKTE ZU DESERIALISIEREN

Ich brauche einfach einen einfachen alten Dictionary(Of String, String) oder ein Äquivalent (Hash-Tabelle, Dictionary(Of String, Object), StringDictionary der alten Schule - 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, ebenso wie das beliebte Json.NET (das ich bereits für die Serialisierung verwende) zu den Kunden).

Offensichtlich keine dieser JSON-Bibliotheken haben diese Stirn schlagen offensichtliche Fähigkeit out of the box--sie sind völlig auf Reflexion-basierte Deserialisierung über starke Verträge konzentriert.

Irgendwelche Ideen?

Beschränkungen:

  1. Ich möchte nicht meinen eigenen JSON-Parser implementieren
  2. ASP.NET 4.0 kann noch nicht verwendet werden
  3. Ich würde es vorziehen, von der älteren, veralteten ASP.NET-Klasse für JSON wegzubleiben.

1 Stimmen

Zu: Einschränkung 3, JavaScriptSerizlizer wird in ASP.NET MVC verwendet und ist nicht mehr veraltet.

37 Stimmen

Es ist unglaublich, wie schwierig es war, einen einfachen Weg zu finden, um eine json-Zeichenfolge in etwas zu konvertieren, das ich leicht verwenden konnte, ohne durch viele verschiedene Stackoverflow zu blättern. Es ist so einfach in anderen Sprachen noch Java und C# scheint zu gehen aus dem Weg zu machen das Leben schwer.

1116voto

James Newton-King Punkte 46367

Json.NET tut dies...

string json = @"{""key1"":""value1"",""key2"":""value2""}";

var values = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);

Weitere Beispiele: Serialisierung von Sammlungen mit Json.NET

15 Stimmen

Funktioniert dies auch, wenn es sich bei den Werten um ganze Zahlen handelt? Werden sie automatisch in "Strings" umgewandelt?

75 Stimmen

@Highmastdon Nein, tut es nicht. Ich habe herausgefunden, dass der beste Weg zur Deserialisierung in ein Wörterbuch die Verwendung von dynamic als Typ für die Werte: JsonConvert.DeserializeObject<Dictionary<string, dynamic>>(json);

2 Stimmen

Ich habe mehrere Antworten auf dieser Seite mit einem sehr chaotischen Schlüssel/Wert-Paar ausprobiert, und JSON.NET war die einzige, die funktioniert hat.

115voto

Crispy Punkte 1316

Ich habe entdeckt, dass .NET eine eingebaute Möglichkeit hat, die JSON-Zeichenfolge in eine Dictionary<String, Object> über die System.Web.Script.Serialization.JavaScriptSerializer Typ in der 3.5 System.Web.Extensions Versammlung. Verwenden Sie die Methode DeserializeObject(String) .

Ich stolperte über diese, wenn eine Ajax-Post (über Jquery) des Inhaltstyps "application/json" zu einer statischen .net Page Method und sah, dass die Methode (die einen einzigen Parameter vom Typ hatte Object ) dieses Wörterbuch auf magische Weise erhalten.

6 Stimmen

Aber der eingebaute javascriptserializer ist fehlerhafter als json.net, diese Lösung ist besser. Zum Beispiel gibt der javascriptseralizer Nullen anstelle von leeren Strings zurück, und funktioniert überhaupt nicht für nullbare Eigenschaften, und so weiter.

1 Stimmen

@pilavdzice Ganz zu schweigen von dem Spaß, den Sie haben, wenn Sie versuchen, Daten zu parsen, da das nicht standardmäßige Datumsformat von MS angenommen wird.

21 Stimmen

Schnelles Code-Beispiel: var jsSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); gefolgt von Dictionary<string, object> dict = (Dictionary<string, object>)jsSerializer.DeserializeObject(jsonString);

95voto

haldo Punkte 11488

System.Text.Json

Dies ist nun möglich mit System.Text.Json die eingebaut ist in .NET Core 3.0 . Es ist jetzt möglich, JSON zu deserialisieren ohne Verwendung von Bibliotheken Dritter.

var json = @"{""key1"":""value1"",""key2"":""value2""}";
var values = JsonSerializer.Deserialize<Dictionary<string, string>>(json);

Auch im NuGet-Paket verfügbar System.Text.Json wenn Sie .NET Standard oder .NET Framework verwenden.


Achten Sie darauf, dass Sie lesen und verstehen:

5 Stimmen

Ja! System.Text.Json ist heutzutage der richtige Weg.

3 Stimmen

Ja, das sieht vielversprechend aus! Beachten Sie jedoch, dass die Standardversion von System.Text.Json in .NET Core 3.1 die Deserialisierung von Dictionaries mit Nicht-String-Schlüsseln nicht unterstützt. Während meine OP war über Zeichenfolgen, in der Praxis jetzt, ich habe eine Menge von Guid-Schlüssel, so dass diese "Bit" mich beim Versuch, den Wechsel zu machen. Es hat auch keine Äquivalente für einige der Attribute (erforderlich, etc.).

0 Stimmen

Nette Antwort, aber die Quelle der .NET json Funktionen ist Newtonsoft.Json;

58voto

JP Richardson Punkte 37290

Für diejenigen, die im Internet suchen und über diesen Beitrag stolpern, habe ich einen Blogbeitrag ü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:

var json = "{\"id\":\"13\", \"value\": true}";
var jss = new JavaScriptSerializer();
var table = jss.Deserialize<dynamic>(json);
Console.WriteLine(table["id"]);
Console.WriteLine(table["value"]);

0 Stimmen

Hm, ich habe Ihre Lösung ausprobiert... Ich habe json wie diese {"id": "13", "value": true} und für mich funktioniert nur Dictionary<dynamic> Lösung

0 Stimmen

Ok ich fand es, wo ist das Problem... Sie müssen [] nach Wörterbuch-Deklaration hinzufügen, um richtig zu deserialisieren... Ich füge Kommentar zu Ihrem Blog-Post zu... Prost ;)

0 Stimmen

Ich habe meine Antwort aktualisiert, um Ihren spezifischen Datensatz zu berücksichtigen. Es funktioniert gut mit dynamisch.

48voto

Dasun Punkte 3103

Ich hatte das gleiche Problem, also habe ich es selbst geschrieben. Diese Lösung unterscheidet sich von anderen Antworten, weil sie in mehrere Ebenen deserialisieren kann.

Senden Sie einfach einen JSON-String an deserializeToDictionary Funktion wird sie nicht stark typisiert zurückgeben Dictionary<string, object> Objekt.

Alter Code

private Dictionary<string, object> deserializeToDictionary(string jo)
{
    var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
    var values2 = new Dictionary<string, object>();
    foreach (KeyValuePair<string, object> d in values)
    {
        // if (d.Value.GetType().FullName.Contains("Newtonsoft.Json.Linq.JObject"))
        if (d.Value is JObject)
        {
            values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
        }
        else
        {
            values2.Add(d.Key, d.Value);
        }
    }
    return values2;
}

Beispiel: Dies ergibt Dictionary<string, object> Objekt einer Facebook JSON-Antwort.

Test

private void button1_Click(object sender, EventArgs e)
{
    string responsestring = "{\"id\":\"721055828\",\"name\":\"Dasun Sameera Weerasinghe\",\"first_name\":\"Dasun\",\"middle_name\":\"Sameera\",\"last_name\":\"Weerasinghe\",\"username\":\"dasun\",\"gender\":\"male\",\"locale\":\"en_US\",  hometown: {id: \"108388329191258\", name: \"Moratuwa, Sri Lanka\",}}";
    Dictionary<string, object> values = deserializeToDictionary(responsestring);
}

Anmerkung: Die Heimatstadt wird weiter zu einem Dictionary<string, object> Objekt.

Update

Meine alte Antwort funktioniert gut, wenn es kein Array auf JSON-String ist. Diese weiter deserialisieren in eine List<object> wenn ein Element ein Array ist.

Senden Sie einfach einen JSON-String an deserializeToDictionaryOrList Funktion wird sie nicht stark typisiert zurückgeben Dictionary<string, object> Objekt oder List<object> .

private static object deserializeToDictionaryOrList(string jo,bool isArray=false)
{
    if (!isArray)
    {
        isArray = jo.Substring(0, 1) == "[";
    }
    if (!isArray)
    {
        var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(jo);
        var values2 = new Dictionary<string, object>();
        foreach (KeyValuePair<string, object> d in values)
        {
            if (d.Value is JObject)
            {
                values2.Add(d.Key, deserializeToDictionary(d.Value.ToString()));
            }
            else if (d.Value is JArray)
            {
                values2.Add(d.Key, deserializeToDictionary(d.Value.ToString(), true));
            }
            else
            {
                values2.Add(d.Key, d.Value);
            }
        }
        return values2;
    }else
    {
        var values = JsonConvert.DeserializeObject<List<object>>(jo);
        var values2 = new List<object>();
        foreach (var d in values)
        {
            if (d is JObject)
            {
                values2.Add(deserializeToDictionary(d.ToString()));
            }
            else if (d is JArray)
            {
                values2.Add(deserializeToDictionary(d.ToString(), true));
            }
            else
            {
                values2.Add(d);
            }
        }
        return values2;
    }
}

0 Stimmen

@Jordan danke für den Hinweis, ich habe einige Änderungen an diesem Code, aber ich habe es jetzt nicht. Dieser Code behandelt nicht JArray Objekte, ich werde den Code aktualisieren, sobald ich es habe.

1 Stimmen

Das ist kein Problem. Ich erwähne es nur, weil das Lernen über die is et as Die Betreiber haben mir sehr geholfen und meinen eigenen Code vereinfacht.

0 Stimmen

Es funktioniert, aber nicht effizient, weil es ToString und dann wieder Deserialize aufruft. Sehen Sie sich die Antwort von Falko unten an. Es ist deserialize die Quelle Zeichenfolge nur einmal.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X