FastJson转Java对像字段不区分大小写
昨天遇到参数key大小写不一致导致校验签名失败的问题,查了很长时间才找到原因。看了一下FastJson源码,发现JSON.toObject中转换成对象的时候会忽略大小写。
所以,当使用了JSON.toObject将json转成Java对象后,再用JSON.toObject转成json,key值就变了。
写个方法验证一下:
public class Person {
private String nickName;
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class JsonToObject {
public static void main(String[] args) {
JSONObject json1 = new JSONObject();
json1.put("nickName", "shawn1");
System.out.println(json1);
Person p1 = json1.toJavaObject(Person.class);
System.out.println(p1.getNickName());
JSONObject json11 = (JSONObject)JSON.toJSON(p1);
System.out.println(json11);
System.out.println("--------------------");
JSONObject json2 = new JSONObject();
json2.put("nickname", "shawn2");
System.out.println(json2);
json2.toJavaObject(Person.class);
Person p2 = json2.toJavaObject(Person.class);
System.out.println(p2.getNickName());
JSONObject json22 = (JSONObject)JSON.toJSON(p2);
System.out.println(json22);
System.out.println("--------------------");
JSONObject json3 = new JSONObject();
json3.put("nIcknAme", "shawn3");
System.out.println(json3);
json3.toJavaObject(Person.class);
Person p3 = json3.toJavaObject(Person.class);
System.out.println(p3.getNickName());
JSONObject json33 = (JSONObject)JSON.toJSON(p3);
System.out.println(json33);
System.out.println("--------------------");
}
}
输出:
{"nickName":"shawn1"}
shawn1
{"nickName":"shawn1"}
--------------------
{"nickname":"shawn2"}
shawn2
{"nickName":"shawn2"}
--------------------
{"nIcknAme":"shawn3"}
shawn3
{"nickName":"shawn3"}
--------------------
JSON.toObject中转换成对象的时候忽略了大小写,可以增强健壮性,但Java类是区分大小写的,如果有两个仅仅带小写不同的属性,可能就出问题了。
给Person增加一个属性再试一下:
public class Person {
private String nickName;
public String getNickName() {
return nickName;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
private String nickname;
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class JsonToObject {
public static void main(String[] args) {
JSONObject json1 = new JSONObject();
json1.put("nickName", "shawn1");
System.out.println(json1);
Person p1 = json1.toJavaObject(Person.class);
System.out.println("nickName:"+p1.getNickName()+"\t nickname:"+p1.getNickname());
JSONObject json11 = (JSONObject)JSON.toJSON(p1);
System.out.println(json11);
System.out.println("--------------------");
JSONObject json2 = new JSONObject();
json2.put("nickname", "shawn2");
System.out.println(json2);
json2.toJavaObject(Person.class);
Person p2 = json2.toJavaObject(Person.class);
System.out.println("nickName:"+p2.getNickName()+"\t nickname:"+p2.getNickname());
JSONObject json22 = (JSONObject)JSON.toJSON(p2);
System.out.println(json22);
System.out.println("--------------------");
JSONObject json3 = new JSONObject();
json3.put("nIcknAme", "shawn3");
System.out.println(json3);
json3.toJavaObject(Person.class);
Person p3 = json3.toJavaObject(Person.class);
System.out.println("nickName:"+p3.getNickName()+"\t nickname:"+p3.getNickname());
JSONObject json33 = (JSONObject)JSON.toJSON(p3);
System.out.println(json33);
System.out.println("--------------------");
}
}
输出:
{"nickName":"shawn1"}
nickName:shawn1 nickname:null
{"nickName":"shawn1"}
--------------------
{"nickname":"shawn2"}
nickName:null nickname:shawn2
{"nickname":"shawn2"}
--------------------
{"nIcknAme":"shawn3"}
nickName:null nickname:shawn3
{"nickname":"shawn3"}
--------------------
这个结果符合你的预期吗?
所以,用JSON.toObject的时候还是得慎重。
以上。
https://wangxuan.me/tech/2023/06/02/FastJson-convert-json-to-Java-Object-field-ignore-case.html
FastJson转Java对像字段不区分大小写的更多相关文章
- mysql字段varchar区分大小写utf8_bin、utf8_general_ci编码区别
mysql字段varchar区分大小写utf8_bin.utf8_general_ci编码区别 在mysql中存在着各种utf8编码格式:utf8_bin将字符串中的每一个字符用二进制数据存储,区分大 ...
- 【译】7. Java反射——私有字段和私有方法
原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...
- 序列化+fastjson和java各种数据对象相互转化
序列化的定义 序列化就是一种用来处理对象流的机制 所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是将对象转换为容易传输的格式的过程 例 ...
- Java 读取clob字段的几种方法
Java 读取clob字段的几种方法 一.第一种 Clob clob = rs.getClob("remark");//Java.sql.Clob String detailinf ...
- fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map
作者:buster2014 推荐:长安散人 fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map JSON字符串与Java对象的转换 1.将Java对象或Java ...
- 前端传数据到后台,后台用实体类接收不到引发的思考----Java bean中字段命名潜规则
1.按照Java语法规范,通常在实体类中的属性,首字母都是小写的.这是由于JavaBean的规范导致的.一般JavaBean属性都是首字母小写,以驼峰命名格式命名,相应的 getter/setter ...
- FastJSON将Java对象转为json,日期显示时间戳未格式化解决办法
JSON版本:FastJson Java 对象转换为 JSON 格式 定义以下 Person JavaBean: public class Person { @JSONField(name = &qu ...
- java反射获取字段的属性值,以及为字段赋值等方法
1.获取某个类的属性值 /*利用getter方法获取值(首字母大写) CjJssetDTO obj: */ String filedName = "Cj"+(i+1); Class ...
- Java反射-修改字段值, 反射修改static final修饰的字段
反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...
- FastJson序列化Json自定义返回字段,普通类从spring容器中获取bean
前言: 数据库的字段比如:price:1 ,返回需要price:1元. 这时两种途径修改: ① 比如sql中修改或者是在实体类转json前遍历修改. ②返回json,序列化时候修改.用到的是fastj ...
随机推荐
- xml转voc,voc转coco,coco转yolo,coco划分,coco检查,yolo检查,coco可视化
平常用coco格式的数据集比较多,所有这里整合一下数据集相关的常用的脚本. pycocotools安装 这个非常重要,因为处理coco数据集时,用pycocotools包非常方便. 自行搜索一下怎么安 ...
- TypeScript 中类的理解?应用场景?
一.是什么 类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础 ❝ 类是一种用户定义的引用数据类型,也称类类型 ❞ 传统的面向对象语 ...
- Python 潮流周刊#47:当你的老师希望你去做开源
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- D365调试进入系统类方法
在生成InventDIMID时,虽然设置了InventDIMID的Number sequence为自定义的Format,但是总是不按指定的Number sequence产生InventDIMID Di ...
- 剑指offer11(Java)-旋转数组中的最小值(简单)
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转.请返回旋转数 ...
- 阿里云 ACK One 多集群管理全面升级:多集群服务、多集群监控、两地三中心应用容灾
简介: 本文介绍了 ACK One 近期发布的 3 个主要特性,覆盖了多集群管理的 3 个主要场景,跨集群服务发现与访问.多集群全局监控.应用容灾.除多集群管理外,ACK One 更是支持连接并管理任 ...
- 阿里云交互式分析与Presto对比分析及使用注意事项
阿里云交互式分析与Presto对比分析及使用注意事项本文由阿里巴巴耿江涛带来以"阿里云交互式分析与Presto对比分析及使用注意事项"为题的演讲.文章首先介绍了Presto以及它的 ...
- Service Mesh 从“趋势”走向“无聊”
简介: 过去一年,阿里巴巴在 Service Mesh 的探索道路上依旧扎实前行,这种坚定并非只因坚信 Service Mesh 未来一定是云计算基础技术的关键组成部分,还因需要借这一技术趋势去偿还过 ...
- [Go] CORS 支持多个 origin 访问的思路 (Access-Control-Allow-Origin 部分)
以下为局部伪代码,仅供参考: var allowOrigin string allowOrigins := config.AppConf.Get("middleware.cors.allow ...
- WPF 漂亮的现代化控件 新 ModernWPF 界面库
这是一个在 GitHub 上完全开源的库,有十分漂亮的界面,整个都是 Win10 风,界面部分和默认 UWP 相近 这个库支持了 .NET Framework 4.5 和以上的版本,以及 .NET C ...