WSH JScript JSONファイルを使用する
はじめに
WSH JScript で、設定ファイルに対応する際に使用した方法です。
WSH(VBScript, JScript) から設定ファイルを扱う場合、JSON を使用すると楽できます。
注意
文字コードは、SJIS を使用しています。
それ以外の文字コードでは、動作検証していません。
また、Chakra をスクリプトエンジンとして利用する場合は、下記を参照。
WSH JScript で、JSONファイルをパースする(Chakra を利用する場合) - イネマルのプログラミング備忘録
実装
- sample.json
{ "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