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

lyo*_*omi 10 java json jackson deserialization

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

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

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

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

有谁知道如何实现这一目标?谢谢!

lyo*_*omi 14

感谢有用的提示,我能够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);
}
Run Code Online (Sandbox Code Playgroud)


nut*_*ike 10

您可以扩展DefaultPrettyPrinter并覆盖beforeArrayValues(...)writeArrayValueSeparator(...)之前的方法以实现所需的行为.之后,您必须通过setPrettyPrinter(...)将新实现添加到JsonGenerator .


Ste*_*erl 6

如果您不想扩展,DefaultPrettyPrinter也可以在indentArraysWith外部设置属性:

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

DefaultPrettyPrinter prettyPrinter = new DefaultPrettyPrinter();
prettyPrinter.indentArraysWith(DefaultPrettyPrinter.Lf2SpacesIndenter.instance);

String json = objectMapper.writer(prettyPrinter).writeValueAsString(object);
Run Code Online (Sandbox Code Playgroud)

  • Lf2SpacesIndenter已弃用(并且在新版本中不再使用);使用DefaultIndenter.SYSTEM_LINEFEED_INSTANCE (6认同)

rai*_*tin 5

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

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

//use mapper 
Run Code Online (Sandbox Code Playgroud)