21

私はJacksonを使用しており、次のように、配列の各要素が各行に表示されるように JSON をきれいに印刷したいと考えています。

{
  "foo" : "バー",
  "何とか" : [
    1、
    2、
    3
  ]
}

true を設定SerializationFeature.INDENT_OUTPUTすると、配列要素ではなくオブジェクト フィールドに改行文字のみが挿入され、代わりに次のようにオブジェクトが出力されます。

{
  "foo" : "バー",
  "何とか" : [1, 2, 3]
}

これを達成する方法を知っている人はいますか?ありがとう!

4

6 に答える 6

22

拡張したくない場合は、プロパティを外部DefaultPrettyPrinterで設定することもできます。indentArraysWith

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);

DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
prettyPrinter.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);

String json = objectMapper.writer(prettyPrinter).writeValueAsString(object);
于 2016-10-14T13:41:44.743 に答える
17

役立つヒントのおかげで、ObjectMapper次のように目的のインデントを設定することができました。

private static class PrettyPrinter extends DefaultPrettyPrinter {
    public static final PrettyPrinter instance = new PrettyPrinter();

    public PrettyPrinter() {
        _arrayIndenter = Lf2SpacesIndenter.instance;
    }
}

private static class Factory extends JsonFactory {
    @Override
    protected JsonGenerator _createGenerator(Writer out, IOContext ctxt) throws IOException {
        return super._createGenerator(out, ctxt).setPrettyPrinter(PrettyPrinter.instance);
    }
}

{
    ObjectMapper mapper = new ObjectMapper(new Factory());
    mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
}
于 2013-02-18T15:30:53.240 に答える
12

DefaultPrettyPrinterを拡張し、メソッドbeforeArrayValues(…)およびwriteArrayValueSeparator(…)をオーバーライドして、目的の動作をアーカイブすることができます。その後、 setPrettyPrinter(…)を介して新しい実装を JsonGenerator に追加する必要があります。

于 2013-02-18T14:49:21.717 に答える
2

ありがたいことに OP によって提供された回答は、1 行あたり 1 つの配列要素形式 のJSONStringwriteValueAsString. ここに基づいて、同じフォーマットの JSONwriteValueをより少ないコードでファイルに直接書き込むソリューション:

private static class PrettyPrinter extends DefaultPrettyPrinter {
    public static final PrettyPrinter instance = new PrettyPrinter();

    public PrettyPrinter() {
        _arrayIndenter = Lf2SpacesIndenter.instance;
    }
}

{
    ObjectMapper mapper = new ObjectMapper();
    ObjectWriter writer = mapper.writer(PrettyPrinter.instance);
    writer.writeValue(destFile, objectToSerialize);
}
于 2014-02-24T11:28:58.137 に答える
0

JSON ジェネレーターを試してみてください...

API リファレンス
の良い例

于 2013-02-18T14:47:41.720 に答える