如何使用Jackson序列化来编写字段的值,而不是它的关键字

时间:2018-04-12 10:27:15

标签: java jackson

假设我有一个简单的类:

public class MyClass {
    private final String id;
    private final String additionalJson;
}

我想将此类序列化为JSON,以便additionalJson中的原始值直接写入JSON 而不用编写字段名称。 此外,应转换id字段,使其名称写为identifier

示例

实例的值为:

id = 1234
additionalJson = "someKey": "someValue"

我想要的序列化JSON应该是:

{
  "identifier": "1234",
  "someKey": "someValue"
}

使用Mixins更改id的名称是微不足道的:

public class MyClassMixin {
    @JsonProperty("identifier")
    private final String id;
}

但是我没有很好的方法来包含原始JSON而不添加字段名称。

我目前的解决方案是为JsonSerializer编写自定义MyClass,使用writeRaw()写入字段值:

public class MyClassSerializer extends JsonSerializer<MyClass> {
@Override
public void serialize(MyClass myClass, JsonGenerator json, SerializerProvider serializerProvider) throws IOException {
    try {
        json.writeStartObject();
        for (Field field : myClass.getClass().getDeclaredFields()) {
            if (Objects.equals(field.getName(), "additionalJson")) {
                json.writeRaw(", " + (String)field.get(angebotsTemplate));
            } else {
                json.writeObjectField(field.getName(), 
            }
        }
        json.writeEndObject();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }
}

这正确地包含additionalJson值(在公开MyClass字段之后)但不使用Mixin。虽然我可以向序列化程序添加代码以转换id名称,但我仍然希望在Mixin中执行此操作,因为MyClass可能有许多字段,每个字段都有自己的转换,我不想在其中定义串行器。

有没有办法实现我想要的,最好是依靠Mixins?

0 个答案:

没有答案