JSONの整形

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());