2016-04-20 1 views
-2

Ich habe einen JSON-String wie folgt aus:Wie JSON deserialisieren

[{"633" : [{"8768" : "hello","8769" : "world"}],"634" : [{"8782" : "on","8783" : "No"}]}] 

Ich versuche, diese Zeichenfolge zu deserialisiert/parsen. Hier

ist, was ich bisher getan haben:

var arrString = "[{\"633\" : [{\"8768\" : \"hello\",\"8769\" : \"world\"}],\"634\" : [{\"8782\" : \"on\",\"8783\" : \"No\"}]}]" 

var attendeeArray = JsonConvert.DeserializeObject<List<Dictionary<int, string>>>(arrString); //error 

Das gibt mir den Fehler: Zusätzliche Informationen: Unerwartetes Zeichen auf beim Wert analysiert: [. Pfad ‚[0] 0,633‘, Zeile 1, Position 11.

Ich frage mich, ob es ist, weil ich verwende int, string, wenn es so etwas wie int, array (int, string) sein sollte?

MEHR INFO

Dies ist in Bezug auf meine früher beantworteten Frage: How to get the values and keys from a json deserialized/parsed string in C#?

Aber jetzt brauche ich Arrays innerhalb von Arrays.

+0

Warum/wie erwarten Sie, dass JSON in eine 'List >' deserialisierbar ist? – Savior

+0

In Ihrer vorherigen Frage hatten Sie ein Array von (int, string) Paaren. Was habt ihr denn jetzt? – Savior

+0

@Pillar - Wie Sie in der Frage sehen können, habe ich eine int, Array [int, string]. aber ich musste noch nie zuvor ein Array innerhalb eines Arrays deserialisieren, daher wurde meine Frage gestellt. – NeoSketo

Antwort

2

In diesem Fall sind die Schlüssel/Wert-Objekte tatsächlich in Arrays eingeschlossen. Dies kann auf die List<Dictionary<int, List<Dictionary<int, string>>>> Typ deserialisiert werden, wie gezeigt unten:

var arrString = "[{\"633\" : [{\"8768\" : \"hello\",\"8769\" : \"world\"}],\"634\" : [{\"8782\" : \"on\",\"8783\" : \"No\"}]}]"; 
var attendeeArray = JsonConvert.DeserializeObject<List<Dictionary<int, List<Dictionary<int, string>>>>>(arrString); 

Die Struktur ist im Wesentlichen:

List 
-- Dictionary<int, List> 
    -- List 
     -- Dictionary<int, string> 
+0

danke! Ich versuche herauszufinden, wie ich den obersten Schlüssel aus dem Array ziehen kann. Ich lege es in eine for-Schleife und versuche TeilnehmerArray [x] .Key, aber es funktioniert nicht ?? – NeoSketo

+1

@NeoSketo: Es ist eigentlich eine andere Ebene wegen des Arrays. Denken Sie daran, dass Sie eine "Liste" von 'Dictionary'-Typen haben, so dass Sie tatsächlich auf die Schlüssel mit etwas wie' attendeeArray [i] [j] .Key' zugreifen. Wenn Sie möchten, können Sie eine weitere Frage mit Ihrem aktuellen Fortschritt stellen und ich werde es mir ansehen. – grovesNL

+0

danke! Ich habe es herausgefunden! viel Anerkennung! – NeoSketo

1

Es könnte sich lohnen, Ihre JSON-Schema überdenken, aber wenn Sie diesen Weg gehen wollen, hier So konnte man die JSON Schleife durch:

dynamic numList = JsonConvert.DeserializeObject(
    @"[{ 
     ""633"": [{ 
      ""8768"": ""hello"", 
      ""8769"": ""world"" 
     }], 
     ""634"": [{ 
      ""8782"": ""on"", 
      ""8783"": ""No"" 
     }] 
    }]" 
    ); 

foreach (dynamic recordList in numList) 
    foreach (dynamic record in recordList) 
    { 
     //recordKey would be "633" for: 
     //"633": [{ 
     // "8768": "hello" 
     //}] 
     var recordKey = record.Name; 

     //.First.First because of the awkward JSON structure. 
     foreach (dynamic entry in record.First.First) 
     { 
      //for {"8768": "hello"} 
      //key would be "8768", value would be "hello" 
      var key = entry.Name; 
      var value = entry.Value; 
     } 
    } 

Sie dann mit ihnen die recordKey und den Eintrag Schlüssel/Wert und nehmen könnte, was Sie (einschließlich Füllung t werden in die von Ihnen bevorzugte formatierte Datenstruktur einbetten).

besser als zu versuchen, mit dem eingegebenen entserialisierten Wert zu arbeiten:

List<Dictionary<int, List<Dictionary<int, string>>>> 

... wie auch immer.

+0

Am besten, sauberes Beispiel! Vor allem nur Zeichenfolgen anstelle von int. Danke Danke! – NeoSketo

+0

wissen Sie, wie auch immer ich kann den Wert von 633 8769's Wert aus dem Datensatz in RecordList-Schleife ziehen? – NeoSketo

+1

Die innerste foreach-Schleife sollte diesen Wert bei der zweiten Iteration erhalten. Andernfalls, wenn Sie zumindest wissen, dass Sie nur zwei Zahlen in jedem Eintrag haben, können Sie vielleicht nur die indizierten Einträge von record.First [1] oder etwas sehen. – Colin