0 はじめに
SeleniumVBAでは、VBAとWebDriverとの送受信はJSON形式でやりとりを行っていますが、プログラム内で処理しているため普段は意識する必要はありません。
しかし、送受信内容を解析する必要がある場合やAPIを利用する通信を行う場合、レスポンスされたJSONデータから値を取り出す処理を自ら行う必要があります。
今回は、SeleniumVBA利用者に特化したJSONからの値の取り出し方法について紹介したいと思います。正規表現から取り出す方法もありますが、圧倒的に便利なWebJsonConverter利用による方法で紹介します。
【予備知識】
SeleniumVBAでは、VBA側でDictionary型で作成した送信用コマンドをクラスモジュール「WebJsonConverter」(※)でJSON形式に変換してWebDriverにHTTP通信で送信しています。WebDriverからのレスポンスもJSON形式なので、WebJsonConverterでDictionary型(もしくはCollention型)に変換して値を取得しています。
(※)「WebJsonConverter」はTim Hall氏作成ツール「VBA-JSON」を利用しています。
1 JSON取得までの流れ
HTTP通信によるJSONデータがレスポンスされるまでの流れです。clientResponseTextにJSON文字列が格納されたものとして、2以降は取り扱います。
Dim url As String
Dim client As New MSXML2.ServerXMLHTTP60
Dim clientResponseText As String
Dim strValue As String
' URLを設定
url = "〇〇〇〇"
' HTTP要求を送信
client.Open "GET", url, False
client.setRequestHeader "△△△△"
client.send
'レスポンスのあったJSON文字列がclientResponseText変数に格納される
clientResponseText = client.responseText
'JSON文字列をイミディエイトウインドウで確認する
Debug.Print clientResponseText
2 波括弧 { } の事例
{"name": "John", "age": 30 }
波括弧で囲まれた部分はDictionaryに変換されます。
上記のJSONからnameキーに対応する値(Johnになります)を拾うには、WebJsonConverter.ParseJSON(JSON文字列)("name")と括弧をつけてキーを指定することにより、値を拾うことができます。
'値を取得(Johnが取得される)
strValue = WebJsonConverter.ParseJSON(clientResponseText)("name")
3 波括弧 { } の入れ子の事例
{"value":{"name": "John", "age": 30 }}
波括弧の中に波括弧がある場合、Dictionaryの入れ子として変換されます。
上記のJSONからnameキーに対応する値(Johnになります)を拾うには、WebJsonConverter.ParseJSON(JSON文字列)("value")("name")と階層順にキーを続けて指定することにより、値を拾うことができます。
なお、入れ子が3つ以上あっても同様に続けて指定します。
'値を取得(Johnが取得される)
strValue = WebJsonConverter.ParseJSON(clientResponseText)("value")("name")
4 角括弧 [ ] の事例
[ "apple", "banana", "cherry" ]
角括弧で囲まれた部分はCollectionとして変換されます。
例えば上記のJSONからカンマで区切られた2番目の値(bananaになります)を拾うには、WebJsonConverter.ParseJSON(JSON文字列)(2)と括弧の中に番号を指定することにより、値を拾うことができます。
なお括弧の中の番号は1始まりですので注意してください。
'値を取得(bananaが取得される)
strValue = WebJsonConverter.ParseJSON(clientResponseText)(2)
5 波括弧と角括弧の混合事例
[{"geometry":{"coordinates":[135.504517,34.693596],"type":"Point"},"type":"Feature","properties":{"addressCode":"","title":"大阪府大阪市北区中之島一丁目1番26号"}}]
上記のJSONは、国土地理院APIを利用して住所情報から緯度・経度に変換した値が格納されたJSONデータで実事例となります。このJSONデータから経度である135.504517の値を取り出します。
まず左側から順番に構造の解釈を行うと良いです。
角括弧で始まっているのでCollectionに変換され、1番目なので(1)を記述。
※上記の例ではCollection内にカンマ区切りがないので1番目しか存在しない。
次の波括弧はDictionaryに変換されキーが"geometry"なので("geometry")を記述。
その次の波括弧はDictionaryに変換されキーが"coordinates"なので("coordinates")を記述。
その次の角括弧はCollectionに変換され1番目なので(1)を記述。
これらを総合して
WebJsonConverter.ParseJSON(JSON文字列)(1)("geometry")("coordinates")(1)と階層順に続けて指定すると値を拾うことができます。
'値を取得(135.504517が取得される)
strValue = WebJsonConverter.ParseJSON(clientResponseText)(1)("geometry")("coordinates")(1)
6 おわりに
波括弧はDictionaryで括弧をつけてキーを指定、角括弧はCollectionで括弧をつけて番号(1始まり)を指定することが分かれば、JSONが複雑になっても値の取り出しに迷うこともなくなるかと思います。
このJSON文字列からの値取り出し方法については、正直、私もモヤモヤしていた部分があったので、こうした記事にすることができて良かったです。