VB.NETでJson形式のデータの取り扱い~Json.NETを使ってみる
VB.NETでJson.NETを使ったJson形式データ取扱いのメモ。
Json.NET を使用して JSON 文字列を VB.net で使用する( 逆シリアライズ ) : logical errorを参考にしてます。
[準備]
①Json.NETのダウンロード⇒Json.NET - Home
②ダウンロードしたファイルを解凍する
③解凍したフォルダの中のbinの下に.NETフレームワークのバージョンごとにフォルダがあるので、適切なバージョンのフォルダを選択する(4.0ならNet40のフォルダを選択)。自分のPCにインストールされている.NETフレームワークは「コントロールパネル」の「プログラムと機能」の一覧にあるので確認できる。下位互換あったはずなので、インストールされているより下位のバージョンを選べば問題ないはず(詳しくないので適当だけど)。
④3で選択したフォルダの中に「Newtonsoft.Json.dll」ってのがあるから、そいつをプロジェクトの参照に追加してやる。参照の追加メニューバーの「プロジェクト」の中の「(プロジェクト名)のプロパティ」から行う。
[実装]
まず今回読み込むJson形式のファイルはこれ。
{ "main_data": { "user_count":5, "items":[ {"user_id":0001,"level":11}, {"user_id":0002,"level":21}, {"user_id":0003,"level":13}, {"user_id":0004,"level":9}, {"user_id":0005,"level":98} ] }, "status_code":200 }
これを読み込むソースが以下になる。2パターンあるようで私的にはパターン1の方が好み。
Imports System.Text Imports Newtonsoft.Json Module JsonTest Sub Main() Dim enc As Encoding = Encoding.UTF8 Dim jsonStr As String = "" Dim jsonFilePath As String = "C:\test\JsonTest" 'ファイルからJson文字列を読み込む Using sr As New System.IO.StreamReader(jsonFilePath, enc) jsonStr = sr.ReadToEnd() End Using 'Json文字列をJson形式データに復元する Dim jsonObj As Object = JsonConvert.DeserializeObject(jsonStr) '値の参照パターン1 Console.WriteLine("値の参照パターン1") '1階層のデータ Console.WriteLine("status_code={0}", jsonObj("status_code")) If jsonObj("main_data") IsNot Nothing Then '2階層のデータ Console.WriteLine("user_count={0}", jsonObj("main_data")("user_count")) '2階層のデータで配列の場合 For Each item In jsonObj("main_data")("items") Console.WriteLine("user_id={0} level={1}", item("user_id"), item("level")) Next '2階層配列データのうち1つ表示 Console.WriteLine("(配列1つ表示)user_id={0}", jsonObj("main_data")("items")(0)("user_id")) End If Console.WriteLine() '値の参照パターン2 Console.WriteLine("値の参照パターン2") '1階層のデータ Console.WriteLine("status_code={0}", jsonObj.SelectToken("status_code")) If jsonObj.selectToken("main_data") IsNot Nothing Then '2階層のデータ Console.WriteLine("user_count={0}", jsonObj.SelectToken("main_data.user_count")) '2階層のデータで配列の場合 Dim i As Integer = 0 While True If jsonObj.SelectToken("main_data.items[" & i & "].user_id") Is Nothing Then Exit While End If Console.WriteLine("user_id={0} level={1}", jsonObj.SelectToken("main_data.items[" & i & "].user_id"), jsonObj.SelectToken("main_data.items[" & i & "].level")) i = i + 1 End While '2階層配列データのうち1つ表示 Console.WriteLine("(配列1つ表示)user_id={0}", jsonObj.SelectToken("main_data.items[0].user_id")) End If Console.ReadLine() End Sub End Module
実行結果は以下の通り。
値の参照パターン1 status_code=200 user_count=5 user_id=1 level=11 user_id=2 level=21 user_id=3 level=13 user_id=4 level=9 user_id=5 level=98 (配列1つ表示)user_id=1 値の参照パターン2 status_code=200 user_count=5 user_id=1 level=11 user_id=2 level=21 user_id=3 level=13 user_id=4 level=9 user_id=5 level=98 (配列1つ表示)user_id=1