2017-01-06 4 views
0

Я хочу, чтобы моя сериализованная JSON выглядеть следующим образом:Джексон пользовательского сериализатор формат JSON

{ 
"abc": "smth", 
"def": "smth", 
"ghi": "smth", 
} 

Как я могу добиться этого с Джексоном? Вот то, что я сделал до сих пор

@Override 
    public void serialize(Value value, JsonGenerator gen, SerializerProvider serializers) throws IOException { 
     gen.writeStartObject(); 
     gen.useDefaultPrettyPrinter(); 
     gen.writeStringField("abc", value.getAaa()); 
     gen.writeStringField("def", value.getDdd()); 
     gen.writeStringField("ghi", value.getGgg()); 
     gen.writeEndObject(); 
    } 

и я получаю следующие выходные

{ 
"abc" : "smth", 
"def" : "smth", 
"ghi" : "smth", 
} 
+0

вы хотите, чтобы довольно-то распечатать это json, правильно? – n00dl3

+0

Хмм, да - я не знал, что есть имя :) – Stuart

+0

, тогда вы не смогли найти [эту страницу ...] (https://fasterxml.github.io/jackson-core/javadoc/2.3. 0/com/quickxml/jackson/core/JsonGenerator.html # setPrettyPrinter (com.fasterxml.jackson.core.PrettyPrinter)) – n00dl3

ответ

1

Как я понимаю, вы хотите, чтобы увидеть отступы до полей в объекте. Таким образом, чтобы достичь этого просто поменять местами две строки:

gen.useDefaultPrettyPrinter(); 
gen.writeStartObject(); 
... 

Мой тест приложения:

import com.fasterxml.jackson.core.JsonFactory; 
import com.fasterxml.jackson.core.JsonGenerator; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     JsonFactory jsonFactory = new JsonFactory(); 

     JsonGenerator gen = jsonFactory.createGenerator(System.out); 

     gen.useDefaultPrettyPrinter(); 
     gen.writeStartObject(); 
     gen.writeStringField("abc", "1"); 
     gen.writeStringField("def", "2"); 
     gen.writeStringField("ghi", "3"); 
     gen.writeEndObject(); 

     gen.flush(); 
    } 
} 

сгенерирует следующий вывод:

{ 
    "abc" : "1", 
    "def" : "2", 
    "ghi" : "3" 
} 

Update: О пространствах вокруг :. Посмотрите на метод this. Как вы можете видеть, что это имеет только два варианта: <space>:<space> и : Итак, из коробки вы не можете сделать это, но вы можете переопределить этот метод:

gen.setPrettyPrinter(new DefaultPrettyPrinter() { 
    @Override 
    public void writeObjectFieldValueSeparator(JsonGenerator jg) throws IOException { 
     jg.writeRaw(": "); 
    } 
}); 

и использовать пользовательские симпатичную принтер вместо useDefaultPrettyPrinter. В этом случае выход будет:

{ 
    "abc": "1", 
    "def": "2", 
    "ghi": "3" 
} 
+0

О, спасибо! Можно ли пропускать пробелы перед двоеточием? Как в моем первом посте – Stuart

+0

Да, это возможно. Посмотрите раздел ** Обновление **. –

+0

Отлично, спасибо! – Stuart

0

Добавить функцию отступов в Mapper

ObjectMapper mapper = new ObjectMapper(); 
mapper.enable(SerializationFeature.INDENT_OUTPUT); 
    String indent= mapper.writeValueAsString(valueObject); 
+0

Id не работает, так как я хочу либо – Stuart