JavaScript , Python, Java(gson) それぞれのJSON整形
JSON 素材
{"a":1,"b":"ABC","c":[1,2,3],"d":{"A":"x", "e":{ "B":23, "C":45},"f":null}}
JavaScript
JSON.stringify で充分、詳細は、JSON.stringify() - JavaScript | MDN
をよく読むこと。
const data = {"a":1,"b":"ABC","c":[1,2,3],"d":{"A":"x", "e":{ "B":23, "C":45},"f":null}} pretty = JSON.stringify(data, null, 4)
結果
{ "a": 1, "b": "ABC", "c": [ 1, 2, 3 ], "d": { "A": "x", "e": { "B": 23, "C": 45 }, "f": null } }
replacer を指定する。
// 値が文字列なら出力させない置換関数 function replacer(key, value) { if (typeof value === 'string') { return undefined; } return value; } pretty = JSON.stringify(data, replacer, 4) console.log(pretty)
結果
{ "a": 1, "c": [ 1, 2, 3 ], "d": { "e": { "B": 23, "C": 45 }, "f": null } }
Python
json をインポートして、load で辞書として読み込む
# -*- coding: UTF-8 -*- import json with open('sample.json', 'r') as f: # JSONファイル→辞書 dict = json.load(f) str = json.dumps(dict, indent=4) print(str) # 書込み with open('test.json', 'w') as fw: json.dump(dict, fw, indent=4)
Json Value に、日本語がある場合は、json.dump を以下のように、ensure_ascii=False を指定しないと \uxxxx と出力されてしまう。
json.dump(dict, fw, indent=4, ensure_ascii=False)
Java(Gson)
GsonBuilder で、setPrettyPrinting() を指定して Gsonインスタンスを生成する。
Gson gson = new GsonBuilder().serializeNulls().setPrettyPrinting().create(); JsonReader reader = new JsonReader(new StringReader(str)); Map<String, Object> map = gson.fromJson(reader, new TypeToken<Map<String, Object>>(){}.getType()); System.out.println(gson.toJson(map));
Gson#toJson() が生成するJSON文字列は、setPrettyPrinting() を実行している場合、
インデントがデフォルトで、空白2文字固定になっている。
このインデントサイズが、気にいらなければ、以下のように、JsonWriter で、setIndent( インデント文字列 ) を指定するしかない。
StringWriter sw = new StringWriter(); JsonWriter jw = gson.newJsonWriter(sw); jw.setIndent(" "); gson.toJson(map, new TypeToken<Map<String, Object>>(){}.getType(), jw); jw.flush(); jw.close(); System.out.println(sw.toString());