我想让我的序列化 json 看起来像这样:
{
"abc": "smth",
"def": "smth",
"ghi": "smth",
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能通过杰克逊实现这一目标?这是我到目前为止所做的
@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();
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出
{
"abc" : "smth",
"def" : "smth",
"ghi" : "smth",
}
Run Code Online (Sandbox Code Playgroud)
要重写writeObjectFieldValueSeparator()函数,您还需要重写createInstance方法。
这对我有用:
public class MyPrettyPrinter extends DefaultPrettyPrinter {
@Override
public DefaultPrettyPrinter createInstance() {
return new MyPrettyPrinter();
}
@Override
public void writeObjectFieldValueSeparator(JsonGenerator jg) throws IOException {
jg.writeRaw(": ");
}
}
Run Code Online (Sandbox Code Playgroud)
然后将其用作映射器的编写器:
objectMapper.writer(new MyPrettyPrinter()).writeValueAsString(object);
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到有关此问题的更多信息。
据我了解,您希望在对象中的字段之前看到缩进。因此,要实现此目的只需交换两行:
gen.useDefaultPrettyPrinter();
gen.writeStartObject();
...
Run Code Online (Sandbox Code Playgroud)
我的测试应用程序:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
生成以下输出:
{
"abc" : "1",
"def" : "2",
"ghi" : "3"
}
Run Code Online (Sandbox Code Playgroud)
更新:关于周围的空间:。看看这个方法。正如您所看到的,它只有两个选项:<space>:<space>因此:,开箱即用您无法执行此操作,但您可以覆盖此方法:
gen.setPrettyPrinter(new DefaultPrettyPrinter() {
@Override
public void writeObjectFieldValueSeparator(JsonGenerator jg) throws IOException {
jg.writeRaw(": ");
}
});
Run Code Online (Sandbox Code Playgroud)
并使用自定义漂亮的打印机而不是useDefaultPrettyPrinter. 在这种情况下,输出将是:
{
"abc": "1",
"def": "2",
"ghi": "3"
}
Run Code Online (Sandbox Code Playgroud)