2016-09-26 6 views
1

Ich versuche, eine JSON in eine flache Datei für eine Datenbank zu konvertieren. Um dies zu tun, muss ich einen Wert im Root-Knoten, dann einen Schlüssel in einem bestimmten Kinder, dann jeden Kind-Wert des Schlüssels.Wie bekomme ich Schlüssel und Schlüssel Kinder Wert mit JSON.net

Es stellt sich heraus ein Alptraum mit dem for each und Guss Problem sein zwischen JObject, JToken und JProperty

Die Quelle JSON

{ 
    "id": "030010014B", 
    "type": "street", 
    "housenumbers": { 
    "13": { 
     "lat": 46.085617, 
     "lon": 3.460492 
    }, 
    "1bis": { 
     "lat": 46.08686, 
     "lon": 3.459992 
    }, 
    "5": { 
     "lat": 46.086469, 
     "lon": 3.460912 
    } 
    } 
} 

Das erwartete Ergebnis

// <id value>;<key of housenumber #>;<lon value>;<lat value> 
030010014B;13;3.460492;46.085617 
030010014B;1bis;3.459992;46.08686 
030010014B;5;3.460912;46.086469 

Aktuelle Code, scheitert miserabel

Dim tmpJson As JObject = JObject.Parse(<json sample as string>) 
Dim house As JToken 
Dim house_p As JToken 
If tmpJson.Property("housenumbers") IsNot Nothing Then 
For Each houses As JObject In tmpJson.Property("housenumbers").Children 'only one 
    For Each house In houses.Descendants 
     fs.Append(tmpJson.Property("id").Value.ToString & ";") 
     Dim hh As JProperty = house 'failing here 
     fs.Append(hh.Name & ";") 'no way to get a key without jproperty 
     For Each house_p In house.Children() 
      fs.AppendLine(house_p.Value(Of String)("lon") & ";" & house_p.Value(Of String)("lat")) 
     Next 
    Next 
Next 
End If 
... 

Mein fehlerhaftes Beispiel ist von den C# Antworten um SO inspiriert, aber der "Wert für Schlüssel zu Werten" scheint eher selten.

Antwort

1

Sie können sie als eine Sammlung von Objekten erhalten und iterieren, dass:

Public Class Location 
    <JsonProperty("lat")> 
    Public Property Latitude As Single 
    <JsonProperty("lon")> 
    Public Property Longitude As Single 
End Class 

Dann den inneren Teil in sa Wörterbuch deserialisieren:

Dim jstr = from whereever 
Dim jobj = JObject.Parse(jstr) 

Dim id As String = jobj("id").ToString 

Dim numbers = JsonConvert.DeserializeObject(Of Dictionary(Of String, Location))(jobj("housenumbers").ToString()) 

For Each kvp In numbers 
    Console.WriteLine("key:{0}, lat: {1}, long: {2}", 
         kvp.Key, kvp.Value.Latitude, 
         kvp.Value.Longitude) 
Next 

Schlüssel: 13, lat: 46,08562, lang: 3.460492
schlüssel: 1bis, lat: 46.08686, lang: 3.459992
schlüssel: 5, lat: 46.08647, lang: 3.460912

Die 030010014B Variable in der Id würde

+0

Ich verstehe nicht wirklich, was passiert, aber es funktioniert! Was wäre die Art von "Zahlen", wenn ich sie vor der Verwendung deklarieren wollte? 'Zahlen als Dictionary (Of String, Location)' funktioniert nicht –

+0

Sie können es als ein Wörterbuch anderswo deklarieren, aber Sie brauchen noch 'Of Dictionary (Of String, Location)' in der 'DeserializeObject' Methode - das sagt Json.NET was Form, um es zu deserialisieren. – Plutonix

Verwandte Themen