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件) を見る