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()转换。示例:

前端传值:

后端接收:

java 复制代码
@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()转换。示例:

前端传值:

后端接收:

java 复制代码
@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(字符串转对象)的时候 设置下划线转驼峰

java 复制代码
ParserConfig.getGlobalInstance().propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
JSON.parseObject(str, RespOrderDTO.class);

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

java 复制代码
SerializeConfig config = new SerializeConfig();
config.propertyNamingStrategy = PropertyNamingStrategy.SnakeCase;
String json = JSON.toJSONString(user, config);

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

java 复制代码
@JSONField(name="user_name")
private String userName;

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

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

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

2、Fastjson首字母大小写问题

2.1、问题

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

java 复制代码
@Data
public class DataIdentity {
    private String BYDBSM;
    private String SNWRSSJSJ;
    private Integer CJFS = 20;
}

测试代码如下:

java 复制代码
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.

java 复制代码
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;
...
}
java 复制代码
...
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

java 复制代码
TypeUtils.compatibleWithJavaBean = true;

也可以通过设置jvm参数。

2.@JSONField注解

java 复制代码
@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()方法

java 复制代码
String str = JSONUtil.toJsonStr(yytStuCountDto);

2.4、参考文章

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

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

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

相关推荐
陈随易2 小时前
Postman 被曝自动往 Claude Code 和 Codex 装插件
前端·后端·程序员
AI你一生一世3 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影4 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯4 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
考虑考虑5 小时前
Posrgresql恢复.backup文件
数据库·后端·postgresql
无奈何杨5 小时前
风控决策系统决策流,策略模式,权重、顺序、投票、最坏
后端
翊众建站5 小时前
用 JSON-LD 给企业官网做结构化数据:LocalBusiness 与 FAQPage 实践笔记
人工智能·搜索引擎·json
Patrick_Wilson6 小时前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言
苏三说技术6 小时前
DeepSeek Harness入驻B站,评论区被干成了大型插件集市!
后端
橙序员小站7 小时前
我一句话让 AI 把公众号工作台搭完了:部署实测记录
后端