无法通过 Jackson 正确反序列化布尔值

问题描述 投票:0回答:3

我在我的项目中使用以下杰克逊映射器。

org.codehaus.jackson jackson-mapper-asl 1.9.13

我的问题是,每当我尝试将 json 字符串转换为对象时,我都无法正确映射布尔值。这是一个非常奇特的问题。 如果我的属性名称以 "is" 开头,例如

"isFlag":true
,则杰克逊不会读取它。如果我将属性名称更改为
"Flag":true
,则会创建正确的对象。

参考Json:

{"ticketNumber": "0970897760","chartPrepared": true,"isFlag": true}

参考类:

class TestClass {
        String ticketNumber;
        boolean chartPrepared;
        boolean isFlag;

        public boolean isChartPrepared() {
            return chartPrepared;
        }
        public void setChartPrepared(boolean chartPrepared) {
            this.chartPrepared = chartPrepared;
        }
        public boolean isFlag() {
            return isFlag;
        }
        public void setFlag(boolean isFlag) {
            this.isFlag = isFlag;
        }
        public String getTicketNumber() {
            return ticketNumber;
        }
        public void setTicketNumber(String ticketNumber) {
            this.ticketNumber = ticketNumber;
        }
    }
}

功能:

TestClass obj = mapper.readValue(text, TestClass.class);
System.out.println(obj.getTicketNumber()+" "+obj.isChartPrepared()+" "+obj.isFlag());

实际产量:

0970897760 true false 

预期输出:

0970897760 true true
jackson boolean deserialization json-deserialization objectmapper
3个回答
3
投票

感谢BusyAnt的回复。我想出了一个更好的解决方案。 在 TestClass 中显式添加 @JsonProperty("isFlag) 解决了这个问题。

@JsonProperty("isFlag")
boolean isFlag;

2
投票

我认为这是因为 Jackson 即使对于布尔值也期望

getXxx()
,所以使用
Boolean
而不是
boolean
总是更好,因为当你在任何 IDE 中生成 getter/setter 时,你只能得到
isFlag()
 boolean
原始类型,但如果是
Boolean
,你就会有
getFlag()


0
投票

这里的问题是 getter 方法名称 isFlag()。 无论您使用 boolean 还是 Boolean,jackson 都希望 getter 以 get***() 开头,就像本例中的 getIsFlag() 一样。使用布尔值总是更好,因为如果您不独占包含,布尔值(基元)将被视为可选,并且它将认为默认值“false”。

如果将 getter 方法更改为 getIsFlag(),它将反序列化而不会出现任何问题。

© www.soinside.com 2019 - 2024. All rights reserved.