【EXCEL VBA】VBAでJSON.stringifyしたい

VBAでREST APIサービスを利用する際、リクエストとしてJSON文字列を送信する場合があると思います。リクエスト送信前にJSONオブジェクトとして保持していたものを文字列化する必要がありますが、VBAにはJSON.stringify相当の関数がありません。自力で文字列化する事も可能ですが、めんどくさいですし、車輪の再発明の匂いがしますよね。実は以前紹介した「VBA-JSON」にはJSONオブジェクトをJSON文字列に変換する関数が用意されています。今回は、その関数を紹介します。

事前準備

「VBA-JSON」を利用するには事前準備が必要となります。以下記事を確認して設定を完了させてください。

サンプルプログラム

JSONオブジェクトをJSON文字列に変換する関数は「JsonConverter.ConvertToJson」です。引数にDictionary型やCollection型からなるオブジェクト(≒JSONオブジェクト)を渡す事で、JSON文字列に変換されます。第二引数にインデント文字列を指定することで整形することも可能です。サンプルプログラム内で紹介します。

Option Explicit

Sub sample()
    
    Dim params As New Dictionary   '「Microsoft Scripting Runtime」を参照設定
    
    params.Add "Key1", "Value1"
    params.Add "Key2", "Value2"
    params.Add "Key3", "Value3"
    
    Dim child As New Dictionary
    
    child.Add "ChildKey1", "ChildValue1"
    child.Add "ChildKey2", "ChildValue2"
    child.Add "ChildKey3", "ChildValue3"
    params.Add "Key4", child
    
    Dim list As New Collection
    list.Add "Item1"
    list.Add "Item2"
    list.Add "Item3"
    list.Add "Item4"
    
    params.Add "Key5", list
    
    ' デフォルト出力
    Debug.Print "デフォルト"
    Debug.Print JsonConverter.ConvertToJson(params)
    
    ' インデント付き
    Debug.Print "インデント付き"
    Debug.Print JsonConverter.ConvertToJson(params, " ")
    
    ' インデント付き(インデント=4)
    Debug.Print "インデント付き(インデント=4)"
    Debug.Print JsonConverter.ConvertToJson(params, " ", 4)
    
End Sub

出力結果

デフォルト
{"Key1":"Value1","Key2":"Value2","Key3":"Value3","Key4":{"ChildKey1":"ChildValue1","ChildKey2":"ChildValue2","ChildKey3":"ChildValue3"},"Key5":["Item1","Item2","Item3","Item4"]}
インデント付き
{
 "Key1": "Value1",
 "Key2": "Value2",
 "Key3": "Value3",
 "Key4": {
  "ChildKey1": "ChildValue1",
  "ChildKey2": "ChildValue2",
  "ChildKey3": "ChildValue3"
 },
 "Key5": [
  "Item1",
  "Item2",
  "Item3",
  "Item4"
 ]
}
インデント付き(インデント=4)
{
     "Key1": "Value1",
     "Key2": "Value2",
     "Key3": "Value3",
     "Key4": {
      "ChildKey1": "ChildValue1",
      "ChildKey2": "ChildValue2",
      "ChildKey3": "ChildValue3"
     },
     "Key5": [
      "Item1",
      "Item2",
      "Item3",
      "Item4"
     ]
}