2016-09-26 20 views
1

jsonをデータベースのフラットファイルに変換しようとしています。 これを行うには、ルートノードでいくつかの値を取得してから、特定の子でキーを取得してから、それぞれの子の値を取得する必要があります。JSON.netでキーと子の値を取得する方法

それはJObjectJTokenJProperty

for eachと悪夢とキャストの問題であることが判明したソース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 
    } 
    } 
} 

期待される結果

// <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 

現在のコード惨めに失敗する

私の失敗例は、C#の回答から得られたものですが、「値から値への値」はかなり珍しいようです。

答えて

1

あなたは、オブジェクトのコレクションとしてそれらを取得し、それを繰り返すことができます。

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

その後SAの辞書に内側の部分をデシリアライズ:

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 

キー:13、緯度:46.0​​8562を、 long:3.460492
key:1bis、lat:46.0​​8686、long:3.459992
key:5、lat:46.0​​8647、long:3.460912

030010014Bは、私は本当に何が起こるかを理解していないが、それは働くあなたのID変数

+0

になります!もしそれを使用する前に宣言したいのであれば、 'numbers'の型は何でしょうか? '数値としての辞書(文字列、場所)' do not work –

+0

辞書として宣言できますが、依然として 'DeserializeObject'メソッドに' Of Dictionary(Of String、Location) 'が必要です。それをデシリアライズするフォーム。 – Plutonix

関連する問題