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开头来命名。

你可能感兴趣的:(java,java,json)