fastjson序列化对象后属性变更问题

使用fastjson进行JSON序列化存储到数据库后,发现JSON字符串“莫名其妙地”多了一些属性。


public class MyClass {// boolean 类型的属性private boolean isActive;private boolean valid;// int 类型的属性private int id;// 默认构造器public MyClass() {}// 带有所有属性的构造器public MyClass(boolean isActive, boolean valid, int id) {this.isActive = isActive;this.valid = valid;this.id = id;}// isActive 的 getter 和 setter 方法public boolean isActive() {return isActive;}public void setActive(boolean isActive) {this.isActive = isActive;}// valid 的 getter 和 setter 方法public boolean getValid() {return valid;}public void setValid(boolean valid) {this.valid = valid;}// id 的 getter 和 setter 方法public int getId() {return id;}public void setId(int id) {this.id = id;}
}

测试 


import com.alibaba.fastjson.JSON;public class MyClassMain {public static void main(String[] args) {// 创建 MyClass 对象MyClass myClass = new MyClass(true, false, 123);// 使用 fastjson 序列化对象String jsonString = JSON.toJSONString(myClass);// 打印 JSON 字符串System.out.println(jsonString);}
}

结果 

{“active”:true,“id”:123,“valid”:false}

多了一个 active 属性,少了一个isActive属性。

问题出在这个函数

com.alibaba.fastjson.serializer.SerializeConfig
public final ObjectSerializer createJavaBeanSerializer(Class<?> clazz) {String className = clazz.getName();long hashCode64 = TypeUtils.fnv1a_64(className);if (Arrays.binarySearch(denyClasses, hashCode64) >= 0) {throw new JSONException("not support class : " + className);}// 关键SerializeBeanInfo beanInfo = TypeUtils.buildBeanInfo(clazz, null, propertyNamingStrategy, fieldBased);if (beanInfo.fields.length == 0 && Iterable.class.isAssignableFrom(clazz)) {return MiscCodec.instance;}return createJavaBeanSerializer(beanInfo);
}

om.alibaba.fastjson.util.TypeUtils#computeGetters

public static List<FieldInfo> computeGetters(Class<?> clazz, //JSONType jsonType, //Map<String,String> aliasMap, //Map<String,Field> fieldCacheMap, //boolean sorted, //PropertyNamingStrategy propertyNamingStrategy //
){// 省略部分代码if(methodName.startsWith("is")){if(methodName.length() < 3){continue;}if(returnType != Boolean.TYPE&& returnType != Boolean.class){continue;}char c2 = methodName.charAt(2);String propertyName;Field field = null;if(Character.isUpperCase(c2)){if(compatibleWithJavaBean){propertyName = decapitalize(methodName.substring(2));} else{propertyName = Character.toLowerCase(methodName.charAt(2)) + methodName.substring(3);}// 这里 isActive 的属性名被计算出 activepropertyName = getPropertyNameByCompatibleFieldName(fieldCacheMap, methodName, propertyName, 2);}// 省略其他JSONField fieldAnnotation = null;if(field != null){fieldAnnotation = TypeUtils.getAnnotation(field, JSONField.class);if(fieldAnnotation != null){if(!fieldAnnotation.serialize()){continue;}ordinal = fieldAnnotation.ordinal();serialzeFeatures = SerializerFeature.of(fieldAnnotation.serialzeFeatures());parserFeatures = Feature.of(fieldAnnotation.parseFeatures());if(fieldAnnotation.name().length() != 0){//关键: 使用 JSONField 注解设置的 name 替代属性名propertyName = fieldAnnotation.name();if(aliasMap != null){propertyName = aliasMap.get(propertyName);if(propertyName == null){continue;}}}if(fieldAnnotation.label().length() != 0){label = fieldAnnotation.label();}}}// 省略部分代码FieldInfo fieldInfo = new FieldInfo(propertyName, method, field, clazz, null, ordinal, serialzeFeatures, parserFeatures,annotation, fieldAnnotation, label);fieldInfoMap.put(propertyName, fieldInfo);}}Field[] fields = clazz.getFields();computeFields(clazz, aliasMap, propertyNamingStrategy, fieldInfoMap, fields);return getFieldInfos(clazz, sorted, fieldInfoMap);
}

fastjson通过反射虽然有能力识别真实的属性名,但是实际操作时会根据 getter 方法反推出属性名,造成转为JSON字符串时和实际属性名存在偏差。

解决办法

布尔类型的变量不要加is前缀或者使用fastjson自带的@JSONField注解,不过这种方式fastjson的侵入性太强。

public class MyClass {@JSONField( name="isActive")// boolean 类型的属性private boolean isActive;private boolean valid;// 省略其他}

阿里巴巴java开发手册

Java开发 命名风格_w3cschool

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/848780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端框架之 MVVM

MVVM vue 是典型的 MVVM 框架&#xff0c;v-model 实现了 VM 部分 MVVM 的理解 M&#xff1a;模型层、数据层&#xff0c;简单理解就是定义在 data 中的变量 V&#xff1a;视图层&#xff0c;就是浏览器展示的页面 M > V&#xff1a;数据的改变&#xff0c;需要同步更新…

公寓远程抄表系统:智能管理方法新的篇章

1.界定和功能 公寓远程抄表系统是一种前沿的自动化控制&#xff0c;它允许物业管理管理人员在远离现场部位收集和分析公寓里的电力能源使用数据&#xff0c;似水、电、气等。根据集成传感器、物联网产品和云计算&#xff0c;系统能实时检测并记录公寓的能耗状况&#xff0c;大…

OCR行驶证识别介绍

OCR行驶证识别是一种基于光学字符识别&#xff08;OCR&#xff09;技术的应用&#xff0c;专门用于识别机动车行驶证上的关键字段信息。以下是关于OCR行驶证识别的详细解释&#xff1a; 定义与原理 OCR行驶证识别通过扫描或拍摄行驶证图片&#xff0c;利用计算机视觉和模式识别…

可视化数据科学平台在信贷领域应用系列三:特征组合

现代各企业都提倡“降本增效”&#xff0c;所以越来越多优秀的工具诞生了。若想在特征加工这块工作上提升效率&#xff0c;建模人员也能有更多时间“偷懒”&#xff0c;都 “Sora”时代了&#xff0c;为啥不巧用工具呢&#xff1f;RapidMiner在信贷风控特征加工组合中是一把利器…

17 - 项目员工 I(高频 SQL 50 题基础版)

17 - 项目员工 I select-- round(sum(e.experience_years)/count(*),2) p.project_id,round(avg(e.experience_years),2) average_years from Project p left join Employee e on p.employee_ide.employee_id group by p.project_id;

智能座舱车载数字人解决方案,低资源占用

随着智能汽车的快速发展&#xff0c;人们对汽车的需求已经超越了单纯的交通工具定义&#xff0c;而是更加追求个性化、智能化的出行体验。在这样的背景下&#xff0c;美摄科技凭借其卓越的技术实力和创新能力&#xff0c;推出了面向企业的智能座舱车载数字人解决方案&#xff0…

Qt Creator常用的快捷键和常用功能

常用快捷键 新建项目&#xff0c;ctrl n 运行项目&#xff0c;ctrl r 构建项目&#xff0c;ctrl b 改变编辑器界面字体显示比例大小&#xff0c;ctrl 鼠标滚轮 对齐代码&#xff0c;ctrl a; ctrl i 跳转到上一行&#xff0c;ctrl shift enter 跳转到下一行&#xff0c;…

nn.GRU和nn.GRUCell区别

nn.GRU和nn.GRUCell在PyTorch中都是用于实现门控循环单元(Gated Recurrent Unit, GRU)的模块,但它们之间存在一些区别: 输入维度: nn.GRU是一个完整的GRU层,它接受一个3D输入张量(batch_size, seq_length, input_size),输出也是一个3D张量(batch_size, seq_length, hidden_si…

Error Domain=com.google.admob Code=1 “Request Error: No ad to show.“

Error Domaincom.google.ads Code1 "Request Error: No ad to show." UserInfo{NSLocalizedDescriptionRequest Error: No ad to show., NSLocalizedFailureReasonRequest Error: No ad to show.}啊&#xff0c;家人们&#xff0c;同事注册谷歌开发者后&#xff0c;给…

PhpStorm 2024 激活码 - JetBrains 高效智能PHP IDE

各位程序员&#xff0c;每天敲代码真的需要一款好用的 IDE&#xff0c;大名鼎鼎的 JetBrains 值得信赖&#xff01;PHP 开发看过来&#xff0c;PhpStorm 个人版首年订阅 618 限时特惠 7.1 折&#xff0c;有需要的朋友一定不要错过&#xff01; PhpStorm 汇集了众多效率功能和集…

Kaggle——Deep Learning(使用 TensorFlow 和 Keras 为结构化数据构建和训练神经网络)

1.单个神经元 创建一个具有1个线性单元的网络 #线性单元 from tensorflow import keras from tensorflow.keras import layers #创建一个具有1个线性单元的网络 modelkeras.Sequential([layers.Dense(units1,input_shape[3]) ]) 2.深度神经网络 构建序列模型 #构建序列模型 …

排序题目:多数元素

文章目录 题目标题和出处难度题目描述要求示例数据范围进阶 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 解法三思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;多数元素 出处&#xff1a;169. 多数元素 难度 2 级 题目描述 要求 给定…

Windows系统的——终端命令行进入文件夹、打开程序或文件、返回路径、切换磁盘、查看路径包含的所有内容和配置环境变量操作

一、Windows系统的一些基础操作 Windows系统的一些基础操作(通过运行命令方式打开)https://blog.csdn.net/xiaochenXIHUA/article/details/122782021?ops_

GLM-4-9B VLLM 推理使用;openai接口调用

参考: https://huggingface.co/THUDM/glm-4-9b-chat 直接运行vllm后端服务: from transformers import AutoTokenizer from vllm import LLM, SamplingParams# GLM-4-9B-Chat-1M # max_model_len, tp_size

Redis常见异常及优化方案

Redis常见异常及优化方案 Redis集群&#xff08;redis-cluster&#xff09;中的三主三从或者哨兵&#xff08;sentinel&#xff09;模式配置是一种常见的高可用架构&#xff0c;用于解决单点故障和提高数据可靠性。然而&#xff0c;即使在这样的配置下&#xff0c;仍然可能会遇…

vue中SKU实现

通过发送请求获取商品详情数据&#xff0c;包括商品规格(specs)和库存信息(skus)。 选中状态更新&#xff1a;根据当前状态进行激活或取消激活的逻辑&#xff0c;通过为每个规格项添加的“selected”字段来标识是否激活&#xff0c;同时利用样式处理&#xff0c;通过动态类属性…

Shell脚本文本处理三剑客(grep、awk、sed)和正则表达式

一、正则表达式 1.正则表达式基础 正则表达式&#xff08;regular expression&#xff09;描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;可以用来检查一个串是否含有某种子串&#xff0c;将匹配的子串替换或者从某个串中取出符号某个条件的子串等&…

青否数字人直播源码超级管理后台操作步骤!

青否数字人直播源码超级管理后台&#xff0c;我们将详细介绍一下数字人的管理后台的详细操作步骤&#xff01; 1.管理端入口 2.管理后台预览 账号管理&#xff0c;模特管理&#xff0c;声音管理&#xff0c;任务管理&#xff0c;卡类管理&#xff0c;代理商&#xff0c;克隆端 …

七月份大理站、ACM独立出版、高录用稳检索,2024年云计算与大数据国际学术会议(ICCBD 2024)

【ACM独立出版 | 高录用 | EI核心检索稳定】 2024年云计算与大数据国际学术会议&#xff08;ICCBD 2024) 2024 International Conference on Cloud Computing and Big Data (ICCBD 2024) 一、重要信息 大会官网&#xff1a;www.iccbd.net &#xff08;点击投稿/参会/了解会…

小程序 UI 风格,独具匠心

小程序 UI 风格&#xff0c;独具匠心