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 ...
随机推荐
- docker 应用篇————nginx 例子[六]
前言 简单整理一下nginx 例子. 正文 拉取nginx 镜像. docker pull nginx 那么会拉取nginx:latest 这个. 如果需要其他的,可以去官网查询一下. 2.docke ...
- django中对模型字段名的限制
Django 对模型的字段名有一些限制: 一个字段的名称不能是 Python 保留字,因为这会导致 Python 语法错误.比如: class Example(models.Model): pass ...
- Spring Boot+mybatis集成数据库访问
1.整合druid数据源 1.1 单数据源配置 <dependency> <groupId>com.alibaba</groupId> <artifactId ...
- Web前端 -- ES6
ES标准中不包含 DOM 和 BOM的定义,只涵盖基本数据类型.关键字.语句.运算符.内建对象.内建函数等通用语法. 本部分只学习前端开发中ES6的最少必要知识,方便后面项目开发中对代码的理解. 1. ...
- WPF/C#:如何显示具有层级关系的数据
前言 比方说我们有以下两个类: public class Class { public string? Name { get; set; } public List<Student>? S ...
- 力扣175(MySQL)-组合两个表(简单)
题目: 表: Person 表: Address 编写一个SQL查询来报告 Person 表中每个人的姓.名.城市和州.如果 personId 的地址不在 Address 表中,则报告为空 null ...
- 大型 Web 应用插件化架构探索
简介: 随着 Web 技术的逐渐成熟,越来越多的应用架构趋向于复杂,例如阿里云等巨型控制台项目,每个产品下都有各自的团队来负责维护和迭代.不论是维护还是发布以及管控成本都随着业务体量的增长而逐渐不可控 ...
- OpenKruise v0.9.0 版本发布:新增 Pod 重启、删除防护等重磅功能
简介: OpenKruise 是阿里云开源的云原生应用自动化管理套件,也是当前托管在 Cloud Native Computing Foundation (CNCF) 下的 Sandbox 项目.它来 ...
- [Trading] 关于短线交易 Day Trading 的知识
短线交易员操纵市场,试图利用股票.期货和其他金融产品价值的短期波动. 以下是你需要知道的关于日交易的知识,包括免费的交易图表,交易策略,以及日交易软件和平台. https://www.thebalan ...
- [Cryptocurrency] (XMR) Monero GUI 连接远程节点 操作方式
Monero 官网下载的钱包,在 高级设置 的节点里支持 "本地节点" 和 "远程节点". 本地节点就是同步区块链数据到本地电脑,安全性高,占用空间大. 远程节 ...