昨天遇到参数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对像字段不区分大小写的更多相关文章

  1. mysql字段varchar区分大小写utf8_bin、utf8_general_ci编码区别

    mysql字段varchar区分大小写utf8_bin.utf8_general_ci编码区别 在mysql中存在着各种utf8编码格式:utf8_bin将字符串中的每一个字符用二进制数据存储,区分大 ...

  2. 【译】7. Java反射——私有字段和私有方法

    原文地址:http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html =================== ...

  3. 序列化+fastjson和java各种数据对象相互转化

    序列化的定义 序列化就是一种用来处理对象流的机制 所谓对象流也就是将对象的内容进行流化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是将对象转换为容易传输的格式的过程 例 ...

  4. Java 读取clob字段的几种方法

    Java 读取clob字段的几种方法 一.第一种 Clob clob = rs.getClob("remark");//Java.sql.Clob String detailinf ...

  5. fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map

    作者:buster2014 推荐:长安散人 fastJson在java后台转换json格式数据探究(二)--处理数组/List/Map JSON字符串与Java对象的转换 1.将Java对象或Java ...

  6. 前端传数据到后台,后台用实体类接收不到引发的思考----Java bean中字段命名潜规则

    1.按照Java语法规范,通常在实体类中的属性,首字母都是小写的.这是由于JavaBean的规范导致的.一般JavaBean属性都是首字母小写,以驼峰命名格式命名,相应的 getter/setter ...

  7. FastJSON将Java对象转为json,日期显示时间戳未格式化解决办法

    JSON版本:FastJson Java 对象转换为 JSON 格式 定义以下 Person JavaBean: public class Person { @JSONField(name = &qu ...

  8. java反射获取字段的属性值,以及为字段赋值等方法

    1.获取某个类的属性值 /*利用getter方法获取值(首字母大写) CjJssetDTO obj: */ String filedName = "Cj"+(i+1); Class ...

  9. Java反射-修改字段值, 反射修改static final修饰的字段

    反射修改字段 咱们从最简单的例子到难, 一步一步深入. 使用反射修改一个private修饰符的变量name 咱们回到主题, 先用反射来实现一个最基础的功能吧. 其中待获取的name如下: public ...

  10. FastJson序列化Json自定义返回字段,普通类从spring容器中获取bean

    前言: 数据库的字段比如:price:1 ,返回需要price:1元. 这时两种途径修改: ① 比如sql中修改或者是在实体类转json前遍历修改. ②返回json,序列化时候修改.用到的是fastj ...

随机推荐

  1. 重学c#系列——索引器(十)

    前言 对于索引器,我们肯定不会陌生.为什么会有索引器这个东西呢?我们发现这东西很像是属性,只是通过索引方式去调用,那就慢慢揭开他的面纱吧. 正文 假设我们要对外暴露一个数组,为了体现其封装性,我们使用 ...

  2. PIL.Image, numpy, tensor, cv2 之间的互转,以及在cv2在图片上画各种形状的线

    ''' PIL.Image, numpy, tensor, cv2 之间的互转 ''' import cv2 import torch from PIL import Image import num ...

  3. c#代码重构与迭代(一)——循环代码的优化

    foreach (var item in list) { Devices _Device = DevicesLogic.GetInstance().GetDevices(item.DeviceID); ...

  4. Asp-Net-Core开发笔记:使用alpine镜像并加入健康检查

    前言 使用 docker 部署 AspNetCore 应用已经是标配了,之前我一直使用 mcr.microsoft.com/dotnet/aspnet:8.0 这类镜像,简单粗暴,不过可以使用 alp ...

  5. MAC Book: Operation not permitted

    背景: 最近清理系统上的一些无用的文件后,为了release出可用空间,所以还要把.Trash目录下的文件清理才真正清理完,但是ls 查看该目录时发现一直报"operation not pe ...

  6. 力扣442(java)-数组中重复的数据(中等)

    题目: 给你一个长度为 n 的整数数组 nums ,其中 nums 的所有整数都在范围 [1, n] 内,且每个整数出现 一次 或 两次 .请你找出所有出现 两次 的整数,并以数组形式返回. 你必须设 ...

  7. 力扣387(java)-字符串中的第一个唯一字符(简单)

    题目: 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 .如果不存在,则返回 -1 . 示例 1: 输入: s = "leetcode"输出: 0示例 2: 输 ...

  8. 力扣479(java)-最大回文数乘积(困难)

    题目: 给定一个整数 n ,返回 可表示为两个 n 位整数乘积的 最大回文整数 .因为答案可能非常大,所以返回它对 1337 取余 . 示例 1: 输入:n = 2输出:987解释:99 x 91 = ...

  9. 项目版本管理的最佳实践:云效飞流Flow篇

    简介: 飞流Flow的最佳实践(使用阿里云云效)为了更好地使用飞流Flow,接下来将结合阿里云云效来讲解飞流Flow的最佳实践 目录 一.分支规约 二.版本号规约 2.1 主版本号(首位版本号) 2. ...

  10. Serverless Kubernetes 落地实践

    ​简介:如何通过原生 Kubernetes 提供 Serverless 能力?如何借力丰富的云原生社区生态?本文将给大家介绍一下我们在 Serverless Kubernetes 上的落地实践. 作者 ...