如何使用标准setter反序列化JSON字符串

时间:2014-10-14 00:38:58

标签: java json serialization jackson

我正在使用jackson-core,databind,注释2.3.3罐子。我有以下简单的类

public class ClassA {
    private int value;

    public int getValue() {
        return this.value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

以下是尝试将JSON字符串反序列化为对象的代码:

import com.fasterxml.jackson.databind.ObjectMapper;

...

final ObjectMapper objectMapper = new ObjectMapper();
ClassA request = objectMapper.readValue("{\"Value\": 1}", ClassA.class);

但是我收到以下错误: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段“Value”(类ClassA),未标记为可忽略(一个已知属性:“value”])  在[来源:java.io.StringReader@3bff5976; line:1,column:12](通过引用链:ClassA [“Value”])

如果我将JSON字符串更改为小写,那么它可以工作。我认为Jackson可以通过遵循setter约定将值映射到setter。我知道我可以将JsonProperty注释添加到ClassA以使其工作但我不能在我的情况下修改ClassA。

我还尝试在调用readValue之前显式启用以下映射功能,但它仍然遇到同样的错误:

import com.fasterxml.jackson.databind.MapperFeature;

...

objectMapper.enable(MapperFeature.AUTO_DETECT_GETTERS);
objectMapper.enable(MapperFeature.AUTO_DETECT_SETTERS);

如何让Jackson绑定到标准的getter / setter(getXxx和setXxx)而不为绑定的类指定注释?

谢谢!

2 个答案:

答案 0 :(得分:1)

看起来这种情况正在发生,因为杰克逊提供了默认的PropertyNamingStrategy。来自documentation

  

如果没有注册的自定义策略,则默认使用Java属性   使用命名策略,将字段名称保留为原样,然后删除   set / get /是方法的前缀(以及小写的初始值)   大写字符序列)。

映射器默认使用Java默认属性命名策略。如果您的JSON属性是Pascal Case(不确定,因为您只提供了1个属性),那么您可以为映射器提供PascalCaseStrategy

final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategy.PascalCaseStrategy());
ClassA request = objectMapper.readValue("{\"Value\": 1}", ClassA.class);

答案 1 :(得分:0)

杰克逊遵循bean命名惯例。

  

我知道我可以将JsonProperty注释添加到ClassA以使其有效但我无法在我的情况下修改ClassA

这就是mixin派上用场的地方。创建一个abstract类,它具有与ClassA相同的方法声明(例如,相同的getter),并使用相应的@JsonProperty注释对它们进行注释。然后,您使用ObjectMapper注册mixin并瞧! ObjectMapper现在将使用mixin类作为序列化和反序列化ClassA的模板。