2013-02-18 37 views
5

我使用Jackson并想漂亮地打印JSON,使得在阵列中的每个元素进行到每一行,如:杰克逊JSON反序列化:在每一行数组元素

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

设置SerializationFeature.INDENT_OUTPUT真只是插入新行字符而不是数组元素,用这种方式打印对象:

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

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

回答

9

你可以扩展DefaultPrettyPrinter和覆盖的方法beforeArrayValues(...)writeArrayValueSeparator(...)到archieve期望的行为。之后,您必须通过setPrettyPrinter(…)将您的新实现添加到您的JsonGenerator。

13

多亏了有用的提示,我可以配置我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); 
} 
+0

感谢您分享您的解决方案。 +1 – nutlike 2013-02-18 15:43:55

1

由OP谢天谢地提供的answer显示一种方式,获得单阵列 - 元素每行格式化JSON String来自writeValueAsString。基于这里的解决方案直接写入相同的格式化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); 
} 
1

如果你不希望延长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);