Jackson JSON反序列化:每行中的数组元素



我使用的是Jackson,我想漂亮地打印JSON,使数组中的每个元素都指向每一行,比如:

{"foo":"bar","废话":[1.2.3.]}

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

{"foo":"bar","废话":[1,2,3]}

有人知道如何做到这一点吗?谢谢

如果不想扩展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);

多亏了这些有用的提示,我能够用所需的缩进配置我的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);
}

您可以扩展DefaultPrettyPrinter,并覆盖方法beforeArrayValues(…)writeArrayValueSeparator(…)[/em>,以归档所需的行为。之后,您必须通过setPrettyPrinter(…)将新的实现添加到JsonGenerator中。

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

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

感谢OP提供的答案显示了从writeValueAsString获得每行格式化JSON String的单个数组元素的方法。在此基础上,提出了一种将相同格式的JSON直接写入writeValue文件的解决方案,代码更少:

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

试用JSON生成器。。。

API参考
的好例子

最新更新