Jackson 自定义序列化器 json 格式

Joh*_*hnD 9 json

我想让我的序列化 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)

Spa*_*ara 9

要重写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)

您可以在此处找到有关此问题的更多信息。


Max*_*kov 4

据我了解,您希望在对象中的字段之前看到缩进。因此,要实现此目的只需交换两行:

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)