java 序列化boolean时属性名前的is被遗漏的原因、解决方案及思考

        当boolean值类型的属性被定义为isXX时,有些序列化框架(如jackson)序列化过程中会把is省略,而有些框架(如gson)则不会,如下图

package com.juneyaoair.qwp.eurekaclient.bean;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;

public class Apple {

    private String color;

    private int weight;

    private boolean isSold;

    private Boolean isGood;

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public boolean isSold() {
        return isSold;
    }

    public void setSold(boolean sold) {
        isSold = sold;
    }

    public Boolean getGood() {
        return isGood;
    }

    public void setGood(Boolean good) {
        isGood = good;
    }

    public static void main(String[] args) throws Exception{
        ObjectMapper mapper = new ObjectMapper();

        Apple apple = new Apple();
        apple.setColor("red");
        apple.setSold(true);
        apple.setGood(true);
        apple.setWeight(10);
        String jsonValue = mapper.writeValueAsString(apple);
        System.out.println(jsonValue);
        System.out.println(new Gson().toJson(apple));
    }
}

运行结果:

{"color":"red","weight":10,"good":true,"sold":true}
{"color":"red","weight":10,"isSold":true,"isGood":true}

原因:

        jackson使用get/set方法为对象赋值而gson使用反射获取属性名为对象赋值。而javaBeanboolean类型属性的get方法为isXXX,如果你将属性名定义为isXXX时,get方法名就变成与属性名同名所以jackson框架就将属性序列化成XXX省略了is。

解决方案:

        使用各框架的序列化别名注解直接指定想要的序列化名字,如jackson框架使用注解 @com.fasterxml.jackson.annotation.JsonProperty 

思考:

        既然会导致这样的问题就让我想到了编码规范,一些不规范的编码会导致某些框架出现不可预期的问题。于是我查了一下,布尔值类型的属性使用is开头来命名确实属于不规范的编码,阿里巴巴编码规范中明确规定boolean类型的属性不能使用is开头来命名。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值