VBAでAPIを使ったツールを作成することになりましてJSONでのやり取りが必要になったのですが、そのためにはVBA-JSONが便利だよってことで使い方と超ざっくりJSONの説明をまとめました
まずざっくりJSON解説
そもそもJSONとは何ぞや?と言われるとデータフォーマット(データの記述形式)の一種です
EXCELをよく利用する方々に身近なデータフォーマットはCSVで、特徴(ルール)を簡単にまとめると
じゃあJSONはどうなのかと言えば
他にも細かな点はいくつかあるけどもWEB系を本格的にやる時に勉強すればいいと思う
JSONデータのサンプル
CSVほど一見でわかる形式ではないのでサンプルと共に見方の説明になります
例えばこんなJSON形式のデータがあるとして
[{"名前":"ジャベ雄","生年月日":{"年":2000,"月":1,"日":1},"身長":180,"体重":70,"好きな食べ物":["肉","野菜"],"眼鏡":true},{"名前":"ジャベ雌","生年月日":{"年":2002,"月":2,"日":2},"身長":150,"体重":null,"好きな食べ物":["甘いもの"],"眼鏡":false}]
よく見るわかりやすい形にすると・・・ ※簡単に変換できるVSCode神です
[
{
"名前": "ジャベ雄",
"生年月日": {
"年":2000,
"月":1,
"日":1
},
"身長":180,
"体重":70,
"好きな食べ物":["肉","野菜"],
"眼鏡":true
},
{
"名前": "ジャベ雌",
"生年月日": {
"年": 2002,
"月": 2,
"日": 2
},
"身長": 150,
"体重": null,
"好きな食べ物": ["甘いもの"],
"眼鏡":false
}
]
これをEXCEL的に表にするとこうなる
名前 | 生年月日 | 身長 | 体重 | 好きな食べ物 | 眼鏡 | |||
年 | 月 | 日 | ||||||
ジャベ雄 | 2001 | 1 | 1 | 180 | 70 | 肉 | 野菜 | ○ |
ジャベ雌 | 2002 | 2 | 2 | 150 | 甘いもの | × |
つまりJSONをざっくり説明すると必ず項目と値が対になっていて、『{}』が階層を『[]』は配列のデータ群になっていると思えばOK
VBA用のライブラリ「VBA-JSON」を入手
ここから実際にVBAで利用する「VBA-JSON」なるモジュールについて
GitHubに公開されているのでダウンロードして「JsonConverter.bas」をダウンロードする
何年も更新されてませんが何の問題もないので気にせずに
https://github.com/VBA-tools/VBA-JSON
VBAで使えるようにするにはVBEの画面でインポートするだけ
プロジェクトエクスプローラー
右クリック→「ファイルのインポート」
もしくは「JsonConverter.bas」をプロジェクトエクスプローラーへドラック&ドロップでもインポートできる
VBA-JSONの使い方
まずはサンプルソース
今回はAPIの説明ではなくVBA-JSONの説明なので細かな話は割愛
とは言え、実際にAPIを叩ソースをちょっと弄っただけなんでそれっぽい感じに
Sub Sample()
Dim url As String
Dim http As MSXML2.XMLHTTP60
Dim params As Scripting.Dictionary
Set http = New MSXML2.XMLHTTP60
Set params = New Scripting.Dictionary
With params
.RemoveAll
.Add "apiKey", "sampleapi"
End With
url = "https://example.com?" & encodeParams(params)
With http
.Open "GET", url, False
.send
Set res = ParseJson(.responseText)
For Each obj In res
Debug.Print obj("名前")
Next
Set res = Nothing
End With
End Sub
Private Function encodeParams(ByVal objDic As Scripting.Dictionary)
Dim arr() As String
Dim i As Long
ReDim arr(objDic.Count - 1) As String
For i = 0 To pDic.Count - 1
arr(i) = objDic.Keys(i) & "=" & Application.WorksheetFunction.EncodeURL(objDic.Items(i))
Next i
encodeParams = Join(arr, "&")
End Function
結局VBA-JSONを使ってる箇所はこの一行だけ
Set res = ParseJson(.responseText)
でもこの一行がないと一番最初のただの長い文字になってしまうところをこんな感じで要素を指定してデータを取り出すことができる
Debug.Print obj("名前") '---ジャベ雄
Debug.Print obj("生年月日")("年") '---2001
Debug.Print obj("好きな食べ物")(0) '---肉
あとがき
JSONの話だけしてもあまり伝わらない気もしますがAPIを利用する前知識と言うか前準備として必要なので存在を知っておくだけでも違うと思う
実際のAPIの話は何か参考例見つけた時に説明しようかと思います
コメント
お世話になります。
パース後のjson処理で、連想配列に
name | 眼鏡
名前 | ○×
という形に格納することはできますか?
ニュアンスが掴み切れていないのですが通例”キー:値”の形にパースされるはずです。
差し支えなければパース前後のデータサンプル記載してもらえると判断できる気がします。