我正在使用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)而不为绑定的类指定注释?
谢谢!
答案 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
的模板。