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のほうがシンプル。

- 作者: David Mark Clements,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/02/23
- メディア: 大型本
- 購入: 2人 クリック: 4回
- この商品を含むブログ (3件) を見る