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使用反射获取属性名为对象赋值。而javaBean的boolean类型属性的get方法为isXXX,如果你将属性名定义为isXXX时,get方法名就变成与属性名同名所以jackson框架就将属性序列化成XXX省略了is。
解决方案:
使用各框架的序列化别名注解直接指定想要的序列化名字,如jackson框架使用注解 @com.fasterxml.jackson.annotation.JsonProperty
思考:
既然会导致这样的问题就让我想到了编码规范,一些不规范的编码会导致某些框架出现不可预期的问题。于是我查了一下,布尔值类型的属性使用is开头来命名确实属于不规范的编码,阿里巴巴编码规范中明确规定boolean类型的属性不能使用is开头来命名。
java 序列化boolean时属性名前的is被遗漏的原因、解决方案及思考相关推荐
- 属性名前两个字母要么都是大写的要么都是小写的(当然数字与_、$算小写)
属性名前两个字母要么都是大写的要么都是小写的(当然数字与_.$算小写) 2015年08月09日 16:44:42 DO IT 阅读数:1079 标签: java属性名 关于属性名 "属性名前 ...
- java 反射机制--根据属性名获取属性值
1.考虑安全访问范围内的属性,没有权限访问到的属性不读取 [java] view plaincopy /** * 根据属性名获取属性值 * * @param fieldName * @param ob ...
- 响应对象转json时属性名大小写问题完美解决
首先:案例是model里的属性名大写,http response时json默认变成小写开头,和model属性不一致. 例子: model为: class User{private String NAM ...
- fastjson将对象转为json时属性名首字母会默认小写,如何自定义
Java对象属性名 private String SrOrder; 得到的json为srOrder而不是SrOrder,而我们想要SrOrder这个key 只需要在属性名上加上@JSONField(n ...
- 关于java中创建对象时属性的初始化过程
java是一种面向对象的编程语言,那么了解创建对象时程序会怎么执行就变得尤为重要,下面我们就一起看看在我们使用new关键字创建对象时是怎么对属性初始化的: 下面是一个Person类,其中有成员变量ag ...
- java 注解之省略属性名value
注解说明 解释:当使用注解,仅给value属性赋值时,此时value属性可以省略,只写属性值.
- Java编写程序时出现警告:Resource leak: 'xxx' is never closed 解决方案
菜鸟新手,学校在教Java,作业里面要求我们编程实现运算一个简单的程序,程序写好了,却发现冒出一个警告,如下图: 百度了一下,意思是申明了名为a的数据输入扫描仪(Scanner),系统就会为它分配相应 ...
- java 首字母小写_Java中属性名首字母大小写问题
Java命名规范中,实体类属性名以小写字母开头,但并没有说不能以大写字母开头 手动编写实体类时,将属性companyName的首字母大写 使用IDE自动生成构造函数 public Custom(lon ...
- java 操作属性值_java反射机制根据属性名获取属性值的操作
一.考虑安全访问范围内的属性,没有权限访问到的属性不读取 /** * 根据属性名获取属性值 * * @param fieldName * @param object * @return */ priv ...
最新文章
- 高频小功率三极管-S9018
- atitit.跨语言实现备份mysql数据库 为sql文件特性 api 兼容性java c#.net php js
- hdu5955 Guessing the Dice Roll【AC自动机】【高斯消元】【概率】
- PHP漏洞之session会话劫持
- 程序员35岁不转型就退休,是真的吗?
- 2018蓝桥杯省赛---java---B---7(螺旋折线)
- mysql in 命令
- 再问数据中台 - 数据中台建设的最大的挑战是什么
- python open函数参数_python open函数的用法笔记
- 10种K线组合给出买进信号
- java中改变文本字体和大小_Java实训——编写一个窗体程序,可以对文本区中的文字设置字体和大小。...
- Android应用分析进阶教程之一- 初识JEBAPI
- 树算法系列之三:GBDT
- 基于Java的网上订餐系统(附:源码 课件)
- 7-5 游客检票 - 实验3 简单的计算及输入输出 -《Python编程基础及应用实验教程》(高等教育出版社)
- T6 根据书籍条形码ISBN查询书籍,完整的方案,可安装
- AutoCAD的下载与安装
- 【TF2基础教程1】结构化数据建模流程
- 阿里云服务器ECS怎么重装系统?
- MySQL 数据库 分组查询
热门文章
- mysql自增id与uuid的区别
- 人工智能写一封种子信,真诚又用心(挽回必备神器)
- 计算机上可移动磁盘,win10系统我的电脑出现很多个可移动磁盘的解决方法
- 大话手游网页无法链接到服务器,大话西游手游网页版IE浏览器设置教程 IE浏览器问题解决指南...
- 苹果公司的企业文化_陈少峰:互联网文化产业主流的商业模式
- 网易Java面试必问:月薪20k+的Java面试都问些什么
- 1522-对称矩阵的判定
- [linux|Ubuntu]安装杂牌扫描仪-方正F5580
- 4.位运算和逻辑运算(带例题)
- 永恩上线服务器维护,LOL:永恩刚上线两天就被针对?Doinb直言:接下来的比赛不让用!...