2013-02-18 17 views
5

her satırında dizi elemanları oldukça desenli JSON dizilerde her eleman gibi her satıra gider böyle:Jackson JSON Seri kaldırma: Ben <a href="https://github.com/FasterXML/jackson-core">Jackson</a> kullanıyorum ve istiyoruz

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

gerçek SerializationFeature.INDENT_OUTPUT ayarlanması yalnızca yeni satır ekler nesne elemanları için değil, dizi elemanları, nesnenin bu şekilde yazdırılması yerine:

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

Bunu nasıl başaracağını bilen var mı? Teşekkürler! JSON Generator denemek

cevap

9

Sen DefaultPrettyPrinter uzatmak ve istenen davranışı arşivlemiştik yöntemleri beforeArrayValues ​​(...) ve writeArrayValueSeparator (...) geçersiz olabilir . Daha sonra yeni Uygulamanızı JsonGenerator'ınıza setPrettyPrinter(…) üzerinden eklemelisiniz. aşağıdaki gibi yararlı ipuçları

13

sayesinde, istenilen girinti ile benim ObjectMapper yapılandırmak başardı: elde için

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

Çözümünüzü paylaştığınız için teşekkür ederiz. +1 – nutlike

1
minnetle OP tarafından sağlanan answer

bir yol gösteren tek array- öğe başına satır öğesi, writeValueAsString'dan JSON String biçimlendirilmiştir. daha az kod ile writeValue bir dosyaya doğrudan aynı biçimlendirilmiş JSON yazmak için çözüm burada bunun Bağlı Olarak: DefaultPrettyPrinter uzatmak istemiyorsanız

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

ayrıca sadece dışarıdan indentArraysWith özelliğini ayarlayabilirsiniz:

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