一、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博客