21

我正在使用杰克逊,并希望漂亮地打印 JSON,以便数组中的每个元素都进入每一行,例如:

{
  “富”:“酒吧”,
  “废话”:[
    1、
    2、
    3
  ]
}

设置SerializationFeature.INDENT_OUTPUTtrue 只为对象字段插入换行符,而不是数组元素,以这种方式打印对象:

{
  “富”:“酒吧”,
  “废话”:[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 回答
5

映射器可以配置(jackson-2.6):

ObjectMapper mapper = ...
DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
prettyPrinter.indentArraysWith(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);
mapper.setDefaultPrettyPrinter(prettyPrinter);

//use mapper 
于 2020-05-08T07:41:41.790 回答
2

值得庆幸的是,OP 提供 的答案String显示了一种从writeValueAsString. writeValue基于它here的解决方案可以使用更少的代码将相同格式的JSON直接写入文件:

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 回答