【入門編】【JSONエンコーダー自作】Dictionary と Array から正しいエスケープ処理済みのJSON文字列を生成するライブラリ – VBScript (Visual Basic Scripting Edition)解析バイブル

スポンサーリンク

こんにちは、現場の最前線で自動化の荒波を乗り越えてきたチーフアーキテクトです。

「マクロの記録」を卒業し、いよいよ自分の手でロジックを組み立て始めた皆さんは、今、最高に面白いフェーズにいます。今日私たちが挑むのは、VBScriptにおける「データの公用語化」、つまりJSONエンコーダーの自作です。

VBScriptには、残念ながら最新の言語のような`JSON.stringify()`は標準搭載されていません。しかし、嘆く必要はありません。ないものは作ればいい。そして、自分で作る過程で「Dictionary(辞書)」や「配列」の真の扱い方を学ぶことこそが、一流のエンジニアへの近道なのです。

「ここをクリアすれば、VBScriptの基本はバッチリですよ」と自信を持って言える内容に仕上げました。さあ、一緒にコードの深淵へ踏み出しましょう。

1. なぜ「JSONエンコーダー」を自作するのか?

現代のシステム連携において、JSONは欠かせない存在です。
VBScriptで取得した設定情報や、Excelから読み取ったリストを、Web APIに投げたり、別のツールに渡したりする際、データを「JSON形式の文字列」に変換(シリアライズ)する必要があります。

このとき、単に文字を繋げるだけではいけません。

  • 文字列の中に `”` (ダブルクォーテーション) があったらどうする?
  • 改行コードが含まれていたら?
  • 配列の中にさらに辞書(Dictionary)が入っていたら?

これらをすべて解決するのが、今回作成する「再帰型JSONエンコーダー」です。

2. アーキテクチャの設計図

まずは頭の中を整理しましょう。JSONに変換するロジックは、データの「型」によって処理を分岐させるのが正解です。

| データの型 | JSONでの表現 | 処理の内容 |
| :— | :— | :— |
| Dictionary | `{ “key”: value }` | キーと値をペアにして `{}` で囲む |
| Array (配列) | `[ value1, value2 ]` | 要素をカンマ区切りにして `[]` で囲む |
| String (文字列) | `”text”` | 特殊文字をエスケープして `”` で囲む |
| Number (数値) | `123` | そのまま出力 |
| Boolean / Null | `true` / `false` / `null` | 小文字の定数として出力 |

この「値(value)」の部分に、再び「Dictionary」や「Array」が登場する可能性があるため、関数の中で自分自身を呼び出す「再帰処理」が重要になります。

3. 極限のJSONエンコーダー:ソースコード

それでは、実戦でそのまま使えるコードを紹介します。このコードは、エスケープ処理やネスト(入れ子構造)に完全対応した、堅牢な設計になっています。

‘ =================================================================
‘ VBScript JSON Encoder (Minimalist & Robust Edition)
‘ 開発: チーフアーキテクト
‘ =================================================================

Option Explicit

”’

”’ 任意のオブジェクトをJSON文字列に変換します。
”’

”’ Dictionary, Array, String, Number, Boolean等 Function JsonEncode(ByVal obj)
Dim strResult, i, keys, key, item, char, charCode

Select Case TypeName(obj)
Case “Dictionary”
‘ — Dictionary(連想配列)の処理 —
strResult = “{”
keys = obj.Keys
For i = 0 To obj.Count – 1
key = keys(i)
‘ キーをエスケープして追加 : 値を再帰的にエンコード
strResult = strResult & JsonEncode(CStr(key)) & “:” & JsonEncode(obj(key))
If i < obj.Count - 1 Then strResult = strResult & "," Next strResult = strResult & "}" Case "Variant()", "Array" ' --- 配列の処理 --- strResult = "[" For i = 0 To UBound(obj) strResult = strResult & JsonEncode(obj(i)) If i < UBound(obj) Then strResult = strResult & "," Next strResult = strResult & "]" Case "String" ' --- 文字列のエスケープ処理 --- strResult = """" For i = 1 To Len(obj) char = Mid(obj, i, 1) Select Case char Case """" : strResult = strResult & "\""" Case "\" : strResult = strResult & "\\" Case "/" : strResult = strResult & "\/" Case vbBack : strResult = strResult & "\b" Case vbFormFeed : strResult = strResult & "\f" Case vbLf : strResult = strResult & "\n" Case vbCr : strResult = strResult & "\r" Case vbTab : strResult = strResult & "\t" Case Else charCode = AscW(char) ' 制御文字などの処理 If (charCode < 32) Then strResult = strResult & "\u" & Right("0000" & Hex(charCode), 4) Else strResult = strResult & char End If End Select Next strResult = strResult & """" Case "Boolean" strResult = LCase(CStr(obj)) Case "Null" strResult = "null" Case "Integer", "Long", "Double", "Single", "Byte" strResult = CStr(obj) Case Else ' 未知の型やEmptyはnullとして扱う strResult = "null" End Select JsonEncode = strResult End Function ---

4. コードの解説と「陥りやすい罠」

このコードには、初心者が躓きやすいポイントを回避するための「知恵」が詰まっています。

① `TypeName` による厳格な型判定

VBScriptは「型に緩い」言語ですが、JSON化においては厳格さが求められます。`TypeName(obj)` を使うことで、そのデータが「Dictionaryなのか」「ただの文字列なのか」を正確に判別しています。

② 文字列のエスケープ処理(最重要!)

ここが最もミスが起きやすい場所です。JSONでは、文字列の中に `”` や `\` が含まれる場合、バックスラッシュでエスケープしなければなりません。
特に、改行コード (`vbCr`, `vbLf`) を `\r`, `\n` に置換し忘れると、生成されたJSONは不正なものになり、読み込み側でエラーを吐きます。

③ 再帰呼び出しの魔術

strResult = strResult & JsonEncode(obj(key))

この一行が魔法の鍵です。値がさらにDictionaryであっても、自分自身(`JsonEncode`)を呼び出すことで、どんなに深い階層のデータ構造でも、自動的に最後まで解析してくれます。

5. 実際に使ってみよう

このライブラリを使って、複雑なデータ構造をJSONに変換する例を見てみましょう。

‘ 1. Dictionaryの作成(ルートオブジェクト)
Dim root : Set root = CreateObject(“Scripting.Dictionary”)

‘ 2. データの流し込み
root.Add “status”, “success”
root.Add “code”, 200

‘ 3. 配列(リスト)の作成
Dim items(2)
items(0) = “Apple”
items(1) = “Banana”
items(2) = “Cherry”
root.Add “products”, items

‘ 4. ネストしたDictionary
Dim user : Set user = CreateObject(“Scripting.Dictionary”)
user.Add “name”, “田中 太郎”
user.Add “note”, “改行” & vbCrLf & “含む文字列”
root.Add “userInfo”, user

‘ — JSON変換実行 —
Dim jsonText
jsonText = JsonEncode(root)

‘ 結果をコンソールに出力
WScript.Echo jsonText

実行結果(イメージ)

{“status”:”success”,”code”:200,”products”:[“Apple”,”Banana”,”Cherry”],”userInfo”:{“name”:”田中 太郎”,”note”:”改行\r\n含む文字列”}}

6. まとめ:基礎を掌握したあなたへ

お疲れ様でした!今回の「JSONエンコーダーの自作」を通じて、以下の重要概念をマスターできたはずです。

1. データの型(Variant)の適切なハンドリング
2. 再帰アルゴリズムによる構造解析
3. 文字列リテラルの厳密なエスケープ処理

これらはVBScriptに限らず、JavaScript、Python、C#など、あらゆる言語に通底する「エンジニアの基礎体力」です。マクロの記録を卒業し、こうした「データの構造」を意識できるようになれば、あなたの作るツールは一気にプロフェッショナルなレベルへと引き上がります。

もし、日付のフォーマットを独自に変えたい、あるいは特定のオブジェクトを除外したいといった要望が出てきたら、ぜひこのコードを自分なりにカスタマイズしてみてください。その試行錯誤こそが、あなたをさらなる高みへと導くでしょう。

「ここをクリアすれば、VBScriptの基本はバッチリですよ」。
次なる一歩を、楽しみにしています。

タイトルとURLをコピーしました