【问题标题】:How to add a new Property with BeanSerializerModifier's changeProperties?如何使用 BeanSerializerModifier 的 changeProperties 添加新属性?
【发布时间】:2016-09-06 17:43:49
【问题描述】:

我的代码:

private class CustomBeanSerializerModifier extends BeanSerializerModifier{ @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc,List<BeanPropertyWriter> beanProperties){ List<BeanPropertyWriter> beanPropertiesToIgnore = new ArrayList<>(); if (!CollectionUtils.isEmpty(fieldSettingsMap)) { for (int i = 0; i < beanProperties.size(); i++) { BeanPropertyWriter beanPropertyWriter = beanProperties.get(i); ... ...

我想要在这里添加一个新属性,例如 String identifier = "someValue"; 我希望将此属性(在某些条件下)添加到序列化的 json 中。

BeanPropertyWriter 的唯一构造函数需要很多参数:

new BeanPropertyWriter(propDef, member, contextAnnotations, declaredType, ser, typeSer, serType, suppressNulls, suppressableValue)

我可以在这里添加一个新属性吗? 如果是,我应该在这里传递给构造函数的值是什么?

【问题讨论】:

    标签: java json serialization jackson


    【解决方案1】:

    不是一个简单的方法,但您可以尝试以下方法

    从你的代码中,我看到了这个

    BeanPropertyWriter beanPropertyWriter = beanProperties.get(i);
    

    使用新属性的复制构造函数创建此beanPropertyWriter的副本(使用以下方式,因为原始构造函数受到保护,因此不可见)

    // Use this to create a copy of the old property, and change name to new name
        BeanPropertyWriter newBeanPropertyWriter = new CustomBeanPropertyWriter(beanPropertyWriter,"newFieldName");
    
            public class CustomBeanPropertyWriter extends BeanPropertyWriter {
                    protected CustomBeanPropertyWriter(BeanPropertyWriter base, String newFieldName) {
                        super(base, new SerializedString(newFieldName));
                    }
                }
    

    这将使用复制构造函数来更改字段名称。

    不确定值部分,但似乎 _field 可能相同。 您能否通过调试器检查值来自哪个字段并相应地更改它。 例如,如果 _field 持有该值,那么也许这可能有效?

    public class CustomBeanPropertyWriter extends BeanPropertyWriter {
    
            protected Field setField(Field newValue){
                super._field = newValue;
            }
    
            protected CustomBeanPropertyWriter(BeanPropertyWriter base, String newFieldName, Field newFieldValue) {
                super(base, new SerializedString(newFieldName));
                setField(newFieldValue);
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-08
      • 2017-03-18
      • 1970-01-01
      • 2011-12-29
      • 2010-12-11
      • 2011-04-21
      相关资源
      最近更新 更多