VBAでJSON文字列をパース VBAでJSON文字列をパース(デシリアライズ)して、その要素にアクセスする方法。
0


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)

148


一覧に戻る