java - 如何使用 Jackson 序列化对象并向其添加动态字段

标签 java android json jackson

我必须参加以下类(class):

public class CustomClass {

    @JsonProperty("Value")
    private boolean value;
    @JsonProperty("OtherObjects")
    private List<OtherObjects> objects;
    @JsonProperty("Num")
    private int num;
    @JsonIgnore
    public String dynamicParameterKey;
 }

在反序列化时,我得到这个对象,作为嵌套对象的一部分,每个对象都有反序列化和序列化的规则。 但是在序列化时,我需要这个对象添加另一个字段,其中“dynamicParamterKey”作为它的键,“value”作为它的值

我无法在编译时添加字段,因为 key 是动态的。

所以我需要做的是将对象序列化为常规对象并添加此自定义字段。

这个类是一大堆类的一部分,所以我需要尽可能地封装它(不使用自定义反序列化器并将其添加到 ObjectMapper 中),并且我可以使用 treeMap 或其他东西,因为它是一个发送给我的较大 json 的一部分。

我怎样才能实现这个目标?

最佳答案

经过一些调查并从很多来源收集零件后,我想出了这个解决方案:

你需要让你的类实现 JsonSerializable这样您就可以进行自定义序列化。

现在因为您想使用默认序列化并且仅添加到它,您需要使用 BeanSerializerFactory来做到这一点。

所以它看起来像这样:

public class CustomClass implements JsonSerializable {

    @JsonProperty("Value")
    private boolean value;
    @JsonProperty("OtherObjects")
    private List<OtherObjects> objects;
    @JsonProperty("Num")
    private int num;
    @JsonIgnore
    public String dynamicParameterKey;


//We do this so Jackson will know how to serialize with dynamic parameter key
@Override
public void serialize(JsonGenerator gen, SerializerProvider provider) throws IOException {
    gen.writeStartObject();

    //use default serializer
    JavaType javaType = provider.constructType(RegulationAnswer.class);
    BeanDescription beanDesc = provider.getConfig().introspect(javaType);
    JsonSerializer<Object> serializer = BeanSerializerFactory.instance.findBeanSerializer(provider,
            javaType,
            beanDesc);
    serializer.unwrappingSerializer(null).serialize(this, gen, provider);

    //add custom fields
    gen.writeBooleanField(dynamicParameterKey, isChecked());

    gen.writeEndObject();
}

@Override
public void serializeWithType(JsonGenerator gen, SerializerProvider serializers, TypeSerializer typeSer) throws IOException {
        serialize(gen, serializers);
}
}

关于java - 如何使用 Jackson 序列化对象并向其添加动态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611629/

相关文章:

JavaScript 数组值未定义?

java - 如何在 JavaFX 中获取阶段的关闭事件?

java - CXF 策略 validator 禁用

java - Jar文件下载到缓存后只能打开一次

android - 尝试在 LG G Watch 上录制音频时,MediaRecorder 抛出 "java.lang.RuntimeException: start failed: -2147483648"

java - 什么是用于在 JSON 对象数组中选择字段值的 Rest Assured 正确 JsonPath get() 格式

java - Java中 fork 子进程的输出

android - View 在 ViewPager 中的 Fragment 中混淆了 EditText 焦点

android - 检查游标是否有结果

javascript - 如果 QuestionID 相同,如何更新 setState 中的对象,否则添加到 setState