Future Convergence PRJ.

主にプログラミング関連で調べたことのメモ(趣味プログラムなので動作は保証しません)

VB.NETでJson形式のデータの取り扱い~Json.NETを使ってみる

VB.NETJson.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」ってのがあるから、そいつをプロジェクトの参照に追加してやる。参照の追加メニューバーの「プロジェクト」の中の「(プロジェクト名)のプロパティ」から行う。
f:id:CHappy:20150105151732j:plain


[実装]
まず今回読み込む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