VBAそのものにはJSON文字列をパースするための関数は含まれておりません。
しかし、ScriptControlを通じて、Javascriptと類似したWindows上で動くスクリプト言語であるJScriptを利用することで、JSONを簡単にパースをすることができます。
次に実際のコードを示します。
Option Explicit
Sub ReadJsonTest()
' A1セルからJSON文字列を取得
Dim str: str = Range("A1").Value
' JSON文字列をデシリアライズ(JScriptを利用)
Dim json: Set json = ParseJson(str)
' JSONのglossary.title要素を表示
MsgBox CallByName(CallByName(json, "glossary", VbGet), "title", VbGet)
End Sub
Function ParseJson(str)
Dim scriptControl: Set scriptControl = CreateObject("ScriptControl")
scriptControl.Language = "JScript"
scriptControl.AddCode "function Parse(str) { return eval('(' + str + ')'); };"
Dim json: Set json = scriptControl.CodeObject.Parse(str)
Set ParseJson = json
End Function
サンプルとして、次のJSON文字列がA1セルに格納されているとします。
(引用先:https://json.org/example.html)
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": [
"GML",
"XML"
]
},
"GlossSee": "markup"
}
}
}
}
}
ParseJson関数が、引数で渡されたJSON文字列をパースする機能を持ちます。scriptControl.AddCodeによって、JScriptのParse関数を定義し、そのParseを次の行で使用しています。
JSONはJavascriptにおけるオブジェクトの表記法をベースに作られているので、JScriptのParse関数の中では、文字列に対し単にevalを行うだけで解析が行われます。
ParseJson関数から返されたJSONオブジェクトの要素にアクセスするには、CallByName関数を使用します。次の例では、glossary.title要素の値を取得しています。CallByNameは一階層ごとしかアクセスができないので、深い階層の値を取得するには入れ子にする必要があります。
MsgBox CallByName(CallByName(json, "glossary", VbGet), "title", VbGet)
3810