问题一
有个很简单的需求,就是把一个数据结构转成String,然后再把这个String转成数据结构。结果在转数据结构的时候,就崩溃了。郁闷,String特别长,感觉无从下手,排查了四个小时才发现问题。
在数据结构中,有如下的代码:
private IosSign ios_sign;
public void setIos_sign(IosSign ios_sign) {
this.ios_sign = ios_sign;
}
public boolean isIos_Sign() {
if (ios_sign == null) {
return false;
}
return ios_sign.isIos_sign();
}
通过fastjson把数据结构转化成String的时候,ios_sign字段被解析成了布尔类型。这样的话,再把String转成数据结构类型就不对了。
不太清楚fastjson的原理,估计它是根据getXXX、isXXX返回的类型来决定字段类型的,而且我发现,如果有isXXX的方法,它会认为会有XXX的字段,这个需要格外注意!!!
如果不存在String和数据结构互转的需求,上述代码是没有问题的。
为了解决这个问题,修改如下:
private IosSign ios_sign;
public void setIos_sign(IosSign ios_sign) {
this.ios_sign = ios_sign;
}
public IosSign getIos_sign() {
return ios_sign;
}
public boolean beIosSign() {
if (ios_sign == null) {
return false;
}
return ios_sign.isIos_sign();
}
2023年5月8日又遇到了这个问题
private String showOriginalPrice; // 1 展示原价 -1不展示原价
public boolean isShowOriginalPrice() {
if (StringUtils.isNotBlank(showOriginalPrice)) {
return showOriginalPrice.equals("1");
}
return false;
}
public void setShowOriginalPrice(String showOriginalPrice) {
this.showOriginalPrice = showOriginalPrice;
}
这次遇到的问题是,在转成String的时候,showOriginalPrice虽然没有被解析成boolean类型,当时,值却变成了“true”,导致String再转成数据结构后值不对了。