2013-02-18 39 views
5

Tôi đang sử dụng Jackson và muốn khá-in JSON như vậy mà mỗi phần tử trong mảng đi với từng ngành nghề, như:Jackson JSON Deserialization: các phần tử mảng trong mỗi dòng

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

Thiết SerializationFeature.INDENT_OUTPUT đúng chỉ chèn xuống dòng ký tự cho các trường đối tượng, không phải phần tử mảng, in đối tượng theo cách này thay thế:

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

Có ai biết cách đạt được điều này không? Cảm ơn!

Trả lời

9

Bạn có thể kéo dài tuổi DefaultPrettyPrinter và ghi đè lên các phương pháp beforeArrayValues ​​(...)writeArrayValueSeparator (...) để archieve hành vi mong muốn . Sau đó, bạn phải thêm Triển khai mới của mình vào JsonGenerator qua setPrettyPrinter(…).

13

Nhờ các gợi ý hữu ích, tôi đã có thể cấu hình ObjectMapper của tôi với mong muốn thụt đầu dòng như sau:

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

Cảm ơn bạn đã chia sẻ giải pháp của mình. +1 – nutlike

1

Các answer may mắn được cung cấp bởi OP cho thấy một cách để có được một đơn array- định dạng từng dòng được định dạng JSON String từ writeValueAsString. Dựa trên đó đây là một giải pháp để viết JSON định dạng tương tự trực tiếp vào một tập tin với writeValue với mã ít:

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

Nếu bạn không muốn mở rộng DefaultPrettyPrinter bạn cũng có thể chỉ cần đặt các indentArraysWith tài sản bên ngoài:

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); 
Các vấn đề liên quan