2016-08-23 3 views
1

Ich habe eine JSON-Datei, die ich mit der Klasse System.Web.Script.Serialization deserialize muss. Der folgende Code:Wie durchgeschachtelte Dictionary <String, Objekt>?

string json = File.ReadAllText(@"C:\file.json"); 
JavaScriptSerializer ser = new JavaScriptSerializer(); 
var dict = ser.Deserialize<Dictionary<string, object>>(json); 

schafft eine verschachtelte Wörterbuch, so etwas wie dieses:

Dictionary<string, Object> outerDictionary; 
Dictionary<string, Object> middleDictionary; 
Dictionary<string, string> innerDictionary; 

Ich muss nun einige der Werte aus der innerDictionary in eine C# Objektklasse greifen, wie:

public class Location 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
    public string Street { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 
} 

Meine Frage ist also, wie kann ich über die verschachtelte Dezimierung iterieren, um die Werte zu erhalten, die ich auf der innersten Ebene brauche?

UPDATE

Mit Hilfe von Jonesopolis Ich habe jetzt die Struktur korrekt Schleife, aber ich bin immer noch nicht die Werte aus dem innersten Wörterbuch zu bekommen?

foreach (var outer in dict) 
{ 
    foreach (var middle in (Dictionary<string, object>)outer.Value) 
    { 
     foreach (var inner in (ArrayList)middle.Value) 
     { 
      foreach (var loc in (Dictionary<string, object>)inner) 
      { 
      } 
     } 
    } 
} 
+0

Hallo, was hast du versuchen? – BugFinder

Antwort

0

wenn Sie wirklich mit diesen Objekten arbeiten wollen:

foreach(var outer in dict) 
{ 
    foreach (var middle in (Dictionary<string, object>) outer.Value) 
    { 
     foreach (var inner in (Dictionary<string, string>) middle.Value) 
     { 
       var location = new Location(); 
       location.Id = inner["Id"]; 
       //etc.. 
     }  
    } 
} 

obwohl, wäre es viel besser, eine Klassenstruktur zu erstellen, die Sie Ihre json deserialisieren können, dass Ihre Daten genau darstellt, anstelle von Wörterbüchern.

+0

Vielen Dank für die Antwort. Wenn ich Ihre Lösung versuche, bekomme ich den Fehler: 'Kann Objekt vom Typ 'System.Collections.ArrayList' nicht umwandeln, um 'System.Collections.Generic.Dictionary'2 [System.String, System.String]'. ' – PixelPaul

+0

gut zu schreiben dann sind deine Typen eigentlich keine Wörterbücher – Jonesopolis

+0

Danke @Jonesopolis, du warst richtig. Meine Typen waren falsch. Ich habe den ursprünglichen Post mit der richtigen Struktur aktualisiert, aber ich bin immer noch nicht in der Lage, die Werte aus dem innersten Wörterbuch zu erhalten? – PixelPaul

1

Wenn Sie das verschachtelte foreach in Jonesopolis's answer nicht gefällt, dann können Sie LINQ verwenden diese Art und Weise:

var data = from outer in dict 
      from middle in (Dictionary<string, object>) outer.Value 
      from inner in (Dictionary<string, string>) middle.Value 
      select new { outer, middle, inner }; 

foreach (var item in data) { 
    // do things with item.inner 
} 
Verwandte Themen