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();
}
}