イネマルのプログラミング備忘録

趣味プログラマのメモ

WSH JScript JSONファイルを使用する

はじめに

WSH JScript で、設定ファイルに対応する際に使用した方法です。
WSH(VBScript, JScript) から設定ファイルを扱う場合、JSON を使用すると楽できます。

注意

文字コードは、SJIS を使用しています。
それ以外の文字コードでは、動作検証していません。

また、Chakraスクリプトエンジンとして利用する場合は、下記を参照。
WSH JScript で、JSONファイルをパースする(Chakra を利用する場合) - イネマルのプログラミング備忘録

実装

{
  "Date": {
    "Year": 2018,
    "Date": "03/21",
    "Time": "12:34"
  },
  "Users": [
    {
      "Country": "Austria",
      "Name": "Hans Meier",
      "Age": 18
    },
    {
      "Country": "Canada",
      "Name": "Joe Blow",
      "Age": 19
    },
    {
      "Country": "Japan",
      "Name": "山田 太郎",
      "Age": 20
    }
  ]
}

  • JSONParser.bat
@if(0)==(0) echo off
title %~n0
%windir%\System32\cscript.exe //nologo //E:JScript "%~f0" %*
echo;&echo;&pause&goto:EOF
@end

/**
 * @brief  エントリーポイント用即時関数
 */
WSH.Quit(function ()
{
    // 初期化
    var jsonFilePath = ".\\sample.json";
    var savePath = ".\\output.json";
    
    var parser = GetJSONParser(jsonFilePath);
    var fso = parser.GetFileSystem();
    if (!fso.FileExists(jsonFilePath)) {
        WSH.Echo("ファイルが見つかりません。");
        return -1;
    }
    
    // 解析
    try {
        var conf = parser.Parse(jsonFilePath);
    }
    catch(e){
        WSH.Echo("解析に失敗しました。\n" + e);
        return -2;
    }
    
    // 読み込み
    WSH.Echo(conf.Date.Year);
    WSH.Echo(conf.Date.Date);
    WSH.Echo(conf.Date.Time);
    
    for (var idx = 0; idx < conf.Users.length; idx++) {
        WSH.Echo("----------------");
        var user = conf.Users[idx];
        WSH.Echo(user.Country);
        WSH.Echo(user.Name);
        WSH.Echo(user.Age);
    }
    
    // 保存
    // ユーザー情報だけ、保存
    parser.Save(savePath, conf.Users);
    
    return 0;
}());

/*
 * @brief  JSONParser 取得
 * @return JSONParser オブジェクト
 * @note
 *     JSON Object (Windows Scripting - JScript)
 *     https://msdn.microsoft.com/en-us/library/cc836458(v=vs.84).aspx
 */
function GetJSONParser() {
    return new((function () {
        // コンストラクタ
        var JSONParser = function () {
            this.fso = WSH.CreateObject("Scripting.FileSystemObject");
            var htmlfile = WSH.CreateObject("htmlfile");
            htmlfile.write('<meta http-equiv="x-ua-compatible" content="IE=9"/>');
            htmlfile.close(this.parser = htmlfile.parentWindow.JSON);
        }
        // アクセサ
        var p = JSONParser.prototype;
        p.GetFileSystem = function () {return this.fso;}
        
        /**
        *  @brief  解析
        *  @param[in]  path jsonファイルのパス
        *  @return 解析結果
        */
        p.Parse = function (path) {
            var jsonFile = this.fso.OpenTextFile(path, 1, true);
            var jsonText = jsonFile.ReadAll();
            jsonFile.Close();
            return this.parser.parse(jsonText);
        }
        /**
        *  @brief  保存
        *  @param[in]  path 保存先のパス
        *  @param[in]  obj 保存するデータ
        */
        p.Save = function (path, obj) {
            var jsonFile = this.fso.OpenTextFile(path, 2, true, -2);
            jsonFile.Write(this.parser.stringify(obj));
            jsonFile.Close();
        }
        return JSONParser;
    })())();
}

あとがき

ちなみに、保存機能を考慮しなければ、テキストを直接 eval に流すだけでも対応できます。
JScript で、JSON オブジェクトを取得する方法は、下記から。 stackoverflow.com