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 ...
随机推荐
- pytorch两种模型保存方式
只保存模型参数 # 保存 torch.save(model.state_dict(), '\parameter.pkl') # 加载 model = TheModelClass(...) model. ...
- pycharm更换主题,pycharm更换皮肤,pycharm更换不同颜色
1.首先 点击File→进入setting 2. 在settings里面找到appearance 3.选择 Theme,下拉即可修改 4.选择不同的主题,darcula是黑色,其他两个是白色
- mysql错误ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- 亿图version 9.2安装教程
记录一下自己安装亿图9.2版本的安装过程~ 先获取安装资料: 百度网盘链接: 链接:https://pan.baidu.com/s/1zJDcF9Y0Xy2CvD4mG_oOfQ?pwd=pqy9 提 ...
- Dubbo Mesh:从服务框架到统一服务控制平台
简介: Apache Dubbo 是一款 RPC 服务开发框架,用于解决微服务架构下的服务治理与通信问题,官方提供了 Java.Golang 等多语言 SDK 实现. 作者:Dubbo 社区 Ap ...
- IT人才能嗑到的这对CP,甜!
简介: 提到文件存储,相信大家都不陌生,在浩瀚的存储发展史中,文件存储无疑是璀璨的,耀眼的.那么,在性能已经成为刚需,自动驾驶行业风起云涌的当下,文件存储与GPU这对CP又有怎样的含糖量呢?今天,我们 ...
- 轻松处理高于平常10倍的视频需求,还能节省60%的IT成本,蓝墨做对了什么?
近年来,Serverless 一直在高速发展,并呈现出越来越大的影响力.主流的云服务商也在不断地丰富云产品体系,提供更好的开发工具,更高效的应用交付流水线,更好的可观测性,更细腻的产品间集成,但一切才 ...
- Forrester云原生开发者洞察白皮书,低代码概念缔造者又提出新的开发范式
简介: 云原生时代的到来为开发者群体带来了前所未有的机遇,让开发者可以更加专注业务价值创造与创新,并使得人人成为开发者成为现实.广大开发者如何转型成为云原生开发者?运维等专业人员在云原生时代如何避免边 ...
- dotnet 读 WPF 源代码笔记 GlyphRun 的 DeviceFontName 的功能是什么
在 WPF 里面的 GlyphRun 里,有一个令人迷惑的 DeviceFontName 属性,似乎给这个属性传入什么值,结果都不会有变更.通过阅读源代码,可以了解到,这是一个没什么用途的属性.本文将 ...
- async 与 promise 的区别
async函数会引式返回一个promise,而promise的resolve值就是函数return的值 使用async和await明显节约了不少代码,不需要.then,不需要写匿名函数处理promis ...