2016-03-30 25 views
0

Verwendung von C# (.NET 4.6) und JSON.NET Wörterbuch formatierteDeserialisieren einen JSON-String als

Ich bin derzeit versuchen, einen großen JSON-String deserialisieren, die in ein Format mit mehreren Ebenen präsentiert wurden - I m zielen darauf ab, einige dieser Daten in einer flachen DB-Tabelle zu speichern, indem sie über eine C# -Klasse die Daten in dem erforderlichen Format erstellen, das in jede Zeile zurückgeschrieben wird.

Hier ist ein Beispiel für das String-Format (Daten mit Zeilenumbrüchen aus der Lesbarkeit zu erhöhen):

{ 
    "Microsoft": 
    { 
     "name" : "Microsoft", 
     "products" : ["Word", "Excel", ["TestThis","TestOrThis"]], 
     "employees" : 
     [ 
      {"John" :{"name" : "John","skills" : ["Support", "Programming"]}}, 
      {"Dave":{"name" : "Dave", "skills" : ["Tester"]}} 
     ] 
    } 
} 

Was ich will, um am Ende wirklich mit ist eine Datenbank Zeile, das nur einige dieser Informationen hat , etwas wie lesen:

"Company Name", "Employee Name" 

z

"Microsoft", "John" 
"Microsoft", "Dave" 
"IBM", "Ted" 

einen grundlegenden JSON-String zu lesen, ist einfach genug, aber ich bin neu JSON verwendet, die mich auf stapften verlassen hat, wie diese zu brechen.

+0

Bitte posten gültiger JSON. Das oben genannte ist nicht gültig. –

+0

Ihr JSON ist nicht gültig, Ihr fehlt das doppelte Zitat nach den "Produkten: – Wattcey

Antwort

0

Vor Ort json2csharp.com genere Klassen von Ihrem JSON, Ihr Beispiel ist nicht gültig JSON. Deserialisieren Sie Ihr JSON in generierte Klassen. Manchmal erzeugt das Werkzeug schlechte Klassen, also seien Sie vorsichtig.

+0

Danke für den Link - ja die Einbeziehung von" .. "zeigt andere mögliche Daten an. Dieser String sollte nicht so wie er sein soll. Die Zeichenfolge, die ich verwende, ist 16 MB groß, weder die Seite, die du verlinkt hast, noch das Tool, auf dem sie basiert, kann mit dieser Menge an Informationen umgehen - ich werde versuchen, etwas von dem Datum ein wenig zu streichen und es erneut zu versuchen. – Bizmark

1

Wir können Ihre JSON, indem zuerst ein paar Klassen wie diese deserialisieren:

class Company 
{ 
    [JsonProperty("name")] 
    public string Name { get; set; } 
    [JsonProperty("employees")] 
    public List<Dictionary<string, Employee>> Employees { get; set; } 
} 

class Employee 
{ 
    [JsonProperty("name")] 
    public string Name { get; set; } 
} 

Dann können wir eine Dictionary<string, Company> wie diese deserialisiert in:

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

Sie werden feststellen, dass dort, wo die Schlüssel können im JSON variieren (zB die Firmen- und Angestelltennamen), wir müssen ein Dictionary anstelle einer statischen Klasse verwenden. Außerdem können wir die Definition von Eigenschaften für die Elemente, an denen wir nicht interessiert sind, wie Produkte und Fähigkeiten, auslassen.

Sobald wir die entserialisierten Unternehmen haben, können wir eine Schleife durch die Ergebnisse bei der gewünschten Ausgabe wie folgt erreichen:

foreach(KeyValuePair<string, Company> kvp in companies) 
{ 
    foreach (Dictionary<string, Employee> employees in kvp.Value.Employees) 
    { 
     foreach (KeyValuePair<string, Employee> kvp2 in employees) 
     { 
      Console.WriteLine(kvp.Value.Name + ", " + kvp2.Value.Name); 
     } 
    } 
} 

Ausgang:

Microsoft, John 
Microsoft, Dave 

Fiddle: https://dotnetfiddle.net/FpK7AN

Verwandte Themen