我在我的项目中使用以下杰克逊映射器。
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
感谢BusyAnt的回复。我想出了一个更好的解决方案。 在 TestClass 中显式添加 @JsonProperty("isFlag) 解决了这个问题。
@JsonProperty("isFlag")
boolean isFlag;
我认为这是因为 Jackson 即使对于布尔值也期望
getXxx()
,所以使用 Boolean
而不是 boolean
总是更好,因为当你在任何 IDE 中生成 getter/setter 时,你只能得到 isFlag()
的 boolean
原始类型,但如果是 Boolean
,你就会有 getFlag()
。
这里的问题是 getter 方法名称 isFlag()。 无论您使用 boolean 还是 Boolean,jackson 都希望 getter 以 get***() 开头,就像本例中的 getIsFlag() 一样。使用布尔值总是更好,因为如果您不独占包含,布尔值(基元)将被视为可选,并且它将认为默认值“false”。
如果将 getter 方法更改为 getIsFlag(),它将反序列化而不会出现任何问题。