当前位置: 首页 > news >正文

Java中json的一点理解

一、Java中json字符串与json对象

1、json本质

json是一种数据交换格式。

常说的json格式的字符串 ==> 发送和接收时都只是一个字符串,它遵循json这种格式。

2、前后端交互传输的json是什么?

前后端交互传输的json都是json字符串

比如:

2.1响应过程:后端响应的实际上是json字符串(原理:Springboot中,关于为什么controller返回前端数据是json格式的思考_为什么我返回result中有一个对象,能返回成json-CSDN博客),前端axios接收的也是字符串,只不过自动帮我们转成了json对象。

2.2请求过程:前端传输的实际上也是json字符串,由后端的Jackson帮我们转成了对应的对象。

3、前端向后端传递json需要注意的点

3.1前端传过来的若是字符串格式的json字符串,则用JSONObject.parseArray()或者JSONObject.parseObject()转换。示例:
 前端传值:

 后端接收:

@PostMapping("/controlResponse")
public Result callBackResponse(@RequestBody String string){List<CallBackResponseDto> list= JSONObject.parseArray(string, CallBackResponseDto.class);return ResultInfo.success();
}//或者如下用object接收
@PostMapping("/controlResponse")
public ResultInfo callBackResponse(@RequestBody Object object) throws Exception {List<CallBackResponseDto> list = JSONObject.parseArray(object.toString(), CallBackResponseDto.class);return ResultInfo.success();
}

3.2若前端传过来的是对象格式的json字符串,则要先用JSON.toJSONString()将object转成字符串,然后用JSONObject.parseArray()或者JSONObject.parseObject()转换。示例:

前端传值:

 后端接收:

@PostMapping("/controlResponse")
public ResultInfo callBackResponse(@RequestBody Object object) throws Exception {List<CallBackResponseDto> list = JSONObject.parseArray(JSON.toJSONString(object), CallBackResponseDto.class);return ResultInfo.success();
}

 二、fastjson中遇到的问题

1、FastJson下划线转驼峰

1.1 parseObject(字符串转对象)的时候 设置下划线转驼峰

ParserConfig.getGlobalInstance().propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
JSON.parseObject(str, RespOrderDTO.class);

1.2 toJSONString(对象转字符串)的时候,设置驼峰转下划线

SerializeConfig config = new SerializeConfig();
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
String json = JSON.toJSONString(user, config);

1.3 单个字段 设置下划线转驼峰

@JSONField(name="user_name")
private String userName;

注意:fastjson会反序列化时会智能匹配,fastjson2不会智能匹配

fastjson 2 大小写以及下划线问题_问答-阿里云开发者社区

Java中@JSONField和@JsonProperty注解的用法及区别详解_java_脚本之家

 2、Fastjson首字母大小写问题

 2.1、问题

使用Fastjson转json之后发现首字母小写。实体类如下:

@Data
public class DataIdentity {private String BYDBSM;private String SNWRSSJSJ;private Integer CJFS = 20;
}

测试代码如下:

public static void main(String[] args) {DataIdentity dataIdentity = new DataIdentity();dataIdentity.setBYDBSM("xxx");dataIdentity.setSNWRSSJSJ(DateUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss"));String str = JSON.toJSONString(dataIdentity);System.out.println(str);
}

测试结果如下:

2.2、分析

通过查看Fastjson源码可知,Fatjson在序列化对象时,会判断compatibleWithJavaBean,如果为false则将首字母小写,compatibleWithJavaBean默认值为false.

public class TypeUtils {private static final Pattern NUMBER_WITH_TRAILING_ZEROS_PATTERN = Pattern.compile("\\.0*$");public static boolean compatibleWithJavaBean = false;public static boolean compatibleWithFieldName = false;
...
}
...
if (Character.isUpperCase(c2)) {if (compatibleWithJavaBean) {propertyName = decapitalize(methodName.substring(2));} else {propertyName = Character.toLowerCase(methodName.charAt(2)) + methodName.substring(3);}
propertyName = getPropertyNameByCompatibleFieldName(fieldCacheMap, methodName, propertyName, 2);
...

2.3、解决方案

1.compatibleWithJavaBean设置为true

TypeUtils.compatibleWithJavaBean = true;

也可以通过设置jvm参数。

2.@JSONField注解

@Data
public class DataIdentity {@JSONField(name = "BYDBSM")private String BYDBSM;@JSONField(name = "SNWRSSJSJ")private String SNWRSSJSJ;@JSONField(name = "CJFS")private Integer CJFS = 20;}

3、使用hutool的JSONUtil.toJsonStr()方法

String str = JSONUtil.toJsonStr(yytStuCountDto);

2.4、参考文章

Fastjson首字母大小写问题_fastjson 首字母小写-CSDN博客

BUG实录 | 第一篇:FastJSON转换Oracle字段成实体后首字母小写问题 - 有来技术 - 博客园

fastjson转换json时,碰到的那些首字母大小写转换的坑! - 简书

http://www.lryc.cn/news/522879.html

相关文章:

  • Vue项目搭建教程超详细
  • 2025年01月蓝桥杯Scratch1月stema选拔赛真题—美丽的图形
  • 【React】插槽渲染机制
  • 计算机网络 | 什么是公网、私网、NAT?
  • 如何解决Outlook无法连接到服务器的问题
  • vue2 web 多标签输入框 elinput是否当前焦点
  • 32单片机综合应用案例——物联网(IoT)环境监测站(四)(内附详细代码讲解!!!)
  • LabVIEW与WPS文件格式的兼容性
  • 小结: 路由协议的演进和分类
  • OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用
  • Android wifi列表中去自身的热点
  • Windows环境本地配置pyspark环境详细教程
  • 《自动驾驶与机器人中的SLAM技术》ch9:自动驾驶车辆的离线地图构建
  • IP属地会随着人的移动而改变吗
  • openharmony应用开发快速入门
  • USB3020任意波形发生器4路16位同步模拟量输出卡1MS/s频率 阿尔泰科技
  • 云消息队列 Kafka 版 V3 系列荣获信通院“云原生技术创新标杆案例”
  • linux下的NFS和FTP部署
  • JS Clipboard API
  • MySQL中大量数据优化方案
  • 重拾Python学习,先从把python删除开始。。。
  • centos 安全配置基线
  • 高级编程语言的基本语法在CPU的眼中是什么样的呢?
  • Redis 性能优化:多维度技术解析与实战策略
  • .netframwork模拟启动webapi服务并编写对应api接口
  • MongoDB 学习指南与资料分享
  • 【Azure 架构师学习笔记】- Azure Function (2) --实操1
  • 扫描深度?滤光片和偏振片区别?
  • HJ4 字符串分隔(Java版)
  • 【脑机接口数据处理】matlab读取ns6 NS6 ns5NS5格式脑电数据