Java 如何使用Jackson序列化来编写字段';s的价值,但不是它的关键

Java 如何使用Jackson序列化来编写字段';s的价值,但不是它的关键,java,jackson,Java,Jackson,假设我有一个简单的类: public class MyClass { private final String id; private final String additionalJson; } 我想将这个类序列化为JSON,以便将additionalJson中的原始值直接写入JSON,而无需写入字段名。 此外,应转换id字段,以便将其名称写为标识符 示例 实例的值为: id = 1234 additionalJson = "someKey": "someValue" 我想

假设我有一个简单的类:

public class MyClass {
    private final String id;
    private final String additionalJson;
}
我想将这个类序列化为JSON,以便将
additionalJson
中的原始值直接写入JSON,而无需写入字段名。 此外,应转换
id
字段,以便将其名称写为
标识符

示例

实例的值为:

id = 1234
additionalJson = "someKey": "someValue"
我想要的序列化JSON应该是:

{
  "identifier": "1234",
  "someKey": "someValue"
}
使用mixin更改
id
的名称非常简单:

public class MyClassMixin {
    @JsonProperty("identifier")
    private final String id;
}
但是我没有一个好方法可以在不添加字段名称的情况下包含原始JSON

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

公共类MyClassSerializer扩展JsonSerializer{
@凌驾
公共void序列化(MyClass MyClass、JsonGenerator json、SerializerProvider SerializerProvider)引发IOException{
试一试{
json.writeStartObject();
对于(字段:myClass.getClass().getDeclaredFields()){
if(Objects.equals(field.getName(),“additionalJson”)){
json.writeRaw(“,”+(String)field.get(angebotsTemplate));
}否则{
json.writeObjectField(field.getName(),
}
}
json.writeEndObject();
}捕获(非法访问例外e){
e、 printStackTrace();
}
}
这正确地包括了
additionalJson
值(在将MyClass字段公开之后)虽然我可以在序列化程序中添加代码来转换
id
名称,但我还是希望在Mixin中这样做,因为
MyClass
可能有很多字段,每个字段都有自己的转换,我不想在序列化程序中定义


是否有一种方法可以实现我想要的,最好是依靠mixin?

你可以简单地将
字符串additionalJson
更改为
映射additionalJson
?我不这么认为。在我的前端,
additionalJson
由用户将JSON写入一个文本区域。
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();
    }
}