VBAでREST APIサービスを利用する際に、サービスからのレスポンスがJSON形式であることが多々あります。自力でJSONをパースするのは厳しいので「VBA-JSON」を利用したパース方法を紹介します。
事前準備
「VBA-JSON」を利用するには事前準備が必要となります。以下記事を確認して設定を完了させてください。
サンプルプログラム
JSONパースのポイントは、「JsonConverter.ParseJson」です。Dictionary型で返却されるので、あとは直接参照なりループ処理等で値を抽出するだけです。
Option Explicit
Sub sample()
Dim httpReq As New XMLHTTP60 '「Microsoft XML, v6.0」を参照設定
Dim params As New Dictionary '「Microsoft Scripting Runtime」を参照設定
' GETサンプル
' リクエスト情報を作成する。
params.Add "Key1", "parameterSample"
params.Add "Key2", "日本語パラメータサンプル"
params.Add "Key3", "% $\記号"
With httpReq
.Open "GET", "https://httpbin.org/get?" & encodeParams(params)
.Send
End With
Do While httpReq.readyState < 4
DoEvents
Loop
Debug.Print "GETレスポンス"
Debug.Print httpReq.responseText
' JSONパースサンプル
Dim jsonObj As Object
Set jsonObj = JsonConverter.ParseJson(httpReq.responseText)
Debug.Print "args-Key1 = " & jsonObj("args")("Key1")
Debug.Print "args-Key2 = " & jsonObj("args")("Key2")
Debug.Print "args-Key3 = " & jsonObj("args")("Key3")
Dim arg As Variant
For Each arg In jsonObj("args")
Debug.Print arg & " = " & jsonObj("args")(arg)
Next
End Sub
' URLエンコード関数
Function encodeParams(pDic As Dictionary)
Dim ary() As String
ReDim ary(pDic.Count - 1) As String
Dim i As Long
For i = 0 To pDic.Count - 1
ary(i) = pDic.Keys(i) & "=" & Application.WorksheetFunction.EncodeURL(pDic.Items(i))
Next i
encodeParams = Join(ary, "&")
End Function
出力結果
GETレスポンス
{
"args": {
"Key1": "parameterSample",
"Key2": "\u65e5\u672c\u8a9e\u30d1\u30e9\u30e1\u30fc\u30bf\u30b5\u30f3\u30d7\u30eb",
"Key3": "% $\\\u8a18\u53f7"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "ja-JP",
"Host": "httpbin.org",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; Zoom 3.6.0)",
"X-Amzn-Trace-Id": "Root=1-XXXXXXXX-6dfffa737c7c748b053f2a11"
},
"origin": "XXX.XXX.XXX.XXX",
"url": "https://httpbin.org/get?Key1=parameterSample&Key2=\u65e5\u672c\u8a9e\u30d1\u30e9\u30e1\u30fc\u30bf\u30b5\u30f3\u30d7\u30eb&Key3=%25 %24\\\u8a18\u53f7"
}
args-Key1 = parameterSample
args-Key2 = 日本語パラメータサンプル
args-Key3 = % $\記号
Key1 = parameterSample
Key2 = 日本語パラメータサンプル
Key3 = % $\記号