java - 如果我在 Java 中使用不同的方法来设置和获取属性,为什么 objectMapper 会失败?

标签 java json string object jackson

我有一个名为 Car 的类,它代表一个实体,它有一个属性可以让我知道汽车的门是否打开。

private int doorsOpened;
public void setDoorsOpened( val ) { this.doorsOpened = val; }
public int getDoorsOpened() { return this.doorsOpened; }

当我需要知道这一点时,我只需调用:

if (car.getDoorsOpened() != 0) {
    car.startAlarm();
}
else {
    car.allIsFine();
}

但是,我不想使用 getDoorsOpened() != 0 比较,因此我创建了一个名为 doorsOpened() 的新方法,它给我带来了 boolean 值:

public boolean doorsOpened() { return this.doorsOpened != 0; }

但是当我想这样做时,使用这个新方法:

String carData = objectMapper.writeValueAsString( car ); 

我得到这个异常:

Unhandled server exception: (was java.lang.NullPointerException) (through reference chain: com.desafioguerreros.artifacts.car.entities.Car["volunteer"])
com.fasterxml.jackson.databind.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: com.desafioguerreros.artifacts.car.entities.Car["volunteer"])
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:232)
    at com.fasterxml.jackson.databind.JsonMappingException.wrapWithPath(JsonMappingException.java:197)
    at com.fasterxml.jackson.databind.ser.std.StdSerializer.wrapAndThrow(StdSerializer.java:187)
    at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:647)
    at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:152)
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:114)
    at com.fasterxml.jackson.databind.ObjectMapper._configAndWriteValue(ObjectMapper.java:2866)
    at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:2323)

为什么?

最佳答案

首先,查看堆栈跟踪,看起来实体中的一个属性为 null 并且导致了异常。如果我的理解是正确的,如果你有一个非常规的 getter,Jackson 将忽略该字段并且不会抛出任何异常。如果您想要自定义 getter 并在序列化中包含该字段,则可以使用 @JsonProperty ,如下所示。

public class car{
    private int doorsOpened;

    @JsonProperty(value="doorsOpened")
    public boolean doorsOpened(){
        return this.doorsOpened != 0; 
    }

}

关于java - 如果我在 Java 中使用不同的方法来设置和获取属性,为什么 objectMapper 会失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43101474/

相关文章:

java - 获取 java bean 属性名称的列表/数组,按照它们在源文件中出现的顺序排列

Java RAD 组件/架构 - 对 .NET 开发人员的建议?

python - 在 Python 中使用数学特殊字符

javascript - 初始化 jQuery 函数并传递带有字符串的变量

ios - 将 TableView Controller 更改为 Collection View Controller

javascript - 函数参数变成对象的名称而不是其引用

java - 排序时非常奇怪的效率怪癖

java - 输入枚举以切换语句结果

javascript - AngularJS 在 $http 调用后添加到 JSON 对象

javascript - Basic Angular - 如何将 json http 响应加载到另一个 json 对象中