コンソールでNode.jsを使いJSONをYAMLに変換する

Node.jsでJSONをYAMLに変換するコンソールプログラム

環境

Windows7 64bit
Node.js v0.6

JSON→YAML

[話者] JSONからYAMLに変換する処理は https://github.com/jeffsu/json2yaml を使用する。


[合いの手] それ使えば完成じゃないの?


[話者] いや、以下の修正をするよ。

  • コンソールで指定したJSONファイルを読み込む。
  • JSONファイルにBOMがついていた場合、除去する。
  • インデント(字下げ)を適切にやってくれる。
  • JSONの文字列の日本語が 「\u9945\u982d」の形式だった場合、元の「饅頭」に戻す。
  • JSON内部に、文字列としてJSONの連想配列を持つ場合もさらに展開して 【 】 で囲む。


src/json2yaml.js を以下のように修正。

--- json2yaml.js.orig	2013-02-21 14:33:48.000000000 +0900
+++ json2yaml.js	2013-10-17 18:09:34.979161100 +0900
@@ -1,4 +1,3 @@
-(function (self) { 
   /*
    * TODO, lots of concatenation (slow in js)
    */
@@ -81,7 +80,13 @@
     if (str.match(/^[\w]+$/)) {
       return str;
     } else {
-      return '"'+escape(str).replace(/%u/g,'\\u').replace(/%U/g,'\\U').replace(/%/g,'\\x')+'"';
+      var s = unescape(str).replace(/\n/g, "\n\t");
+      if (s.match('\\":')) {
+        s = json2yaml(s).replace(/\n/g, "\n\t");
+        return '【'+s+'】';
+      }else{
+        return '"'+s+'"';
+      }
     }
   }
 
@@ -89,7 +94,7 @@
     ret.push(normalizeString(obj));
   }
   
-  self.json2yaml = function(obj) {
+  var json2yaml = function(obj) {
     if (typeof obj == 'string') {
       obj = JSON.parse(obj);
     }
@@ -98,4 +103,3 @@
     convert(obj, ret);
     return ret.join("\n");
   };
-})(this);

そのjson2yaml.jsを以下のj2y.jsで呼び出すよ。
j2y.js:

var fs = require('fs');
// include
eval(fs.readFileSync('json2yaml.js')+'');

if (process.argv.length <= 2){
  console.log("usage: node j2y SOME.json > SOME.yaml" );
  process.exit(1);
}

var json = fs.readFileSync(process.argv[2], 'utf8') + '';
json = json.replace(/^\uFEFF/,'');
var yaml = json2yaml(json);
console.log(yaml);


使い方は

$ node j2y.js SOME.json > SOME.yaml

だ。


しかし思うのだが、YAMLを使わずにJSONを使い、単にJSONのインデントだけ読みやすくすればよかったのではないか‥‥?
YAMLは仕様が複雑なので結局標準データ形式にはなれないっぽい。JSONのほうがシンプル。


Nodeクックブック

Nodeクックブック