杰克逊:允许财产命名策略与@JsonCreator合作

时间:2015-06-23 13:30:02

标签: java jackson

我正在使用Jackson来序列化/反序列化不可变的POJO。由于POJO是不可变的,我将它们定义为:

class Foo {
    private final String bar;
    private final String wibbleBoing;

    @JsonCreator
    public Foo(@JsonProperty("bar") String bar, @JsonProperty("wibbleBoing") wibbleBoing) {
        this.bar = bar;
        this.wibbleBoing = wibbleBoing;
    }

    ... [getters] ...
}

我被迫在构造函数参数上使用@JsonProperty,因为Java字节码不包含参数名称。 [实际上,我知道可以为Java 8做,而我可以使用jackson-module-parameter-names来规避这一点,但这对我来说不是一个选择现在]。

现在,让我们假设我也想使用属性命名策略,这样我就可以将所有属性名称更改为带有下划线的小写而不是驼峰大小写,并且这样我就没有改变我现有的POJO。

在Jackson 2.3中,这是一种享受。但是,在Jackson 2.4中,@JsonProperty - 带注释的构造函数参数的显式命名似乎胜过了命名策略。

重新命名我的POJO中的所有@JsonProperty注释是一个漏洞的抽象,我宁愿不这样做......所以有另一种方法可以设置我的映射器或在全局范围内应用该属性命名策略到这样的构造函数参数?

1 个答案:

答案 0 :(得分:2)

您可能想尝试更高版本:至少2.5(.4)或2.6.0-rc2(官方2.6.0应尽快出来,但在此之前)。 此区域中存在已知错误,这是由隐式名称(getter / setter,字段,构造函数参数名称)和显式覆盖(如@JsonProperty)之间的划分产生的。 2.6.0修复了这些;我不是百分百肯定是否所有人都以2.5的形式向后移植。

如果您必须使用早期版本,则可以通过对JacksonAnnotationIntrospector进行子类化并覆盖findNameForSerialization()findNameForDeserialization()findImplicitPropertyName()(或其他内容)来解决问题接近那些,请参阅javadocs),并在那里添加转换。这将是一种解决方法,但允许您使工作正常,直到版本按预期工作。