FastJson常用方法总结

项目中常用JSON工具类Alibaba的FastJson

依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
</dependency>

JSON转换

https://blog.csdn.net/weixin_44436677/article/details/131269751

https://www.cnblogs.com/Rover20230226/p/17494288.html

1. 实体类→JSON对象

1
2
3
4
5
//先把entity转化为string,再把string转化为jsonObj
JSONObject dataObject = JSONObject.parseObject(JSON.toJSONString(reqVo));
//SonarLint建议父类的静态成员不应该使用子类访问,我们应该使用父类JSON类中的方法
JSONObject dataObject = JSON.parseObject(JSON.toJSONString(reqVo));

2. JSON对象→实体类

1
Entity entity = JSONObject.toJavaObject(jsonObject, Entity.class);

3. Map→JSON对象

1
2
3
//Map转为JSONObject
JSONObject jsonObject = JSON.toJSON(map);
JSONObject jsonObject = JSONObject.parseObject(JSON.toJSONString(map));

4. JSON对象→Map

1
2
//JSONObject转为Map
Map<String, Object> map = JSONObject.toJavaObject(jsonObject, Map.class);

5.String转化为JSON对象

1
JSONObject jsonObject = JSONObject.fromObject(stringText);

6.实体类→String(不过滤空值)

1
String jsonStr = JSONObject.toJSONString(VO,SerializerFeature.WriteMapNullValue);

接收前端参数

1
2
3
4
5
6
7
8
9
10
11
@PostMapping("/findAreaGisByMap")
public TableDataInfo findAreaGisByMap(@RequestBody JSONObject jsonObject) {
String model=jsonObject.getString("model");
logger.info("请求模块【"+model+"】");
JSONObject pageObj = JSONObject.parseObject(jsonObject.getJSONObject("page").toJSONString()); //获取分页信息
JSONObject params = JSONObject.parseObject(jsonObject.getJSONObject("params").toJSONString()); //获取查询参数
startPage(pageObj);
AreaGisVo areaGis=JSONObject.toJavaObject(params, AreaGisVo.class);
List<AreaGisVo> list = areaGisService.findAreaGisByMap(areaGis);
return getDataTable(list);
}

JSON交互数据库(传参、取出)

一条数据的返回值就是JSONObject,多条的返回值就是List

service

1
JSONObject findObj = ctoCutoverMapper.selectExtInfoType2(resultObj);

Mapper.java

1
2
3
4
//接收单条数据
JSONObject selectExtInfoType2(JSONObject paramObj);
//接收多条数据
List<JSONObject> queryUserList(JSONObject paramObj);

Mapper.xml

入参类型不用声明,返回类型需要声明为com.alibaba.fastjson.JSONObject

1
2
3
4
5
6
7
8
9
<select id="selectType1GjInfo" resultType="com.alibaba.fastjson.JSONObject">
select
(
select count(*) from device,onu_device where device.`id` = onu_device.`id` and device.`sts` = 30 and onu_device.`gf_id` = #{resId}
) as ontSum,
(
select count(*) from w_resasgn_serv_res_info as w where w.`gf_id` = #{resId}
) as userSum
</select>
1
2
3
4
5
6
7
8
<select id="queryUserList" resultType="com.alibaba.fastjson.JSONObject">
select `USER_ACC_NBR` as userAccNbr ,`DEVICE_ID` as deviceId ,`DEVICE_NAME` as deviceName ,`OLT_NAME` as oltName , `OLT_IP_NAME` as oltIp ,`PON_PORT_NAME` as ponPortName,
`OBD_NAME` as obdName ,`OBD_CONNECTOR_NAME` as obdConnectorName ,`OBD_CONNECTOR_CODEINGROUP` as obdConnectorCodeInGroup ,`GF_NAME` as gfName ,`GF_CONNECTOR_NAME` as gfConnectorName
from w_resasgn_serv_res_info
where 1=1
<if test="oltId != null and oltId != ''"> and `OLT_ID` = #{oltId}</if>
<if test="ponPortId != null and ponPortId != ''"> and `PON_PORT_ID` = #{ponPortId}</if>
</select>

常用方法总结

1. get与getString与(String) get

在 Alibaba fastjson 中,get、getString 和 (String) get 方法是用于获取 JSON 对象中某个属性值的方法。它们之间的区别如下:

  1. get 方法:get 方法是 fastjson 中最基本的获取属性值的方法。它返回一个 Object 类型的值,你需要根据实际情况进行类型转换。如果属性值是字符串类型,你可以使用 toString() 方法将其转换为字符串。
  2. getString 方法:getString 方法是 get 方法的一种特殊情况。它只能用于获取属性值为字符串类型的情况。如果属性值不是字符串类型,getString 方法会返回 null。使用 getString 方法可以省去你手动进行类型转换的步骤,更加简便。
  3. (String) get 方法:这是通过将 get 方法的返回值强制转换为 String 类型来获取属性值的方法。它假设你已经确定属性值是字符串类型,如果实际属性值类型不是字符串,将会抛出 ClassCastException 异常。因此,在使用该方法时必须确保属性值的类型是字符串,否则可能会导致程序运行时的错误。

根据返回值的类型和用途的不同,你可以选择适合自己需求的方法来获取属性值。如果知道属性值的类型,最好使用相应的方法,这样可以避免类型转换错误和异常。

2.拿到子节点为JSON对象

1
JSONObject baseInfo = jsonObject.getJSONObject("detail");

3.opt方法(fastjson不支持这个方法)

在 org.json 库中,JSONObject 提供了一系列的 opt 方法,例如 optStringoptIntoptBoolean 等。这些方法可以帮助你从 JSON 对象中获取对应类型的值,并且在键不存在时不会抛出异常。

对于 optString,如果指定的键不存在,它会返回一个空字符串(“”);
对于 optInt,如果指定的键不存在或者值无法转换为整数,它会返回 0;
对于 optBoolean,如果指定的键不存在,或者值无法转换为布尔类型,它会返回 false。

这些 opt 方法的好处在于,它们提供了安全的方式来获取 JSON 对象中的值,避免了因为键不存在或者数据类型不匹配而引发异常。

举个例子:

1
2
3
4
JSONObject jsonObject = new JSONObject('{"name": "Alice", "age": 25}');
String name = jsonObject.optString("name"); // 返回 "Alice"
int age = jsonObject.optInt("age"); // 返回 25
boolean married = jsonObject.optBoolean("married"); // 返回 false,因为键"married"不存在

总的来说,opt 方法是 JSON 解析库中一个非常实用的功能,它提供了一种安全、便捷的方式来处理 JSON 数据中的键值对。

其他问题

改变属性与前端交互名称@JsonProperty

如果希望实体类属性与数据库字段保持一致,但是与前端交互改一个名字。又或者是属性返回给前端之后,与属性名字不正确(可能是前后端传输规定不一致导致自动进行了转换)。

可以使用@JsonProperty来指定序列化和反序列化时候的名字转换。

@JsonProperty 注解是 Jackson 库中的一个注解,用于指定 JSON 序列化和反序列化时的属性名称。当一个 Java 对象需要转换为 JSON 格式或者从 JSON 转换为 Java 对象时,@JsonProperty 注解可以帮助你指定属性在 JSON 中的名称,以及在反序列化时需要匹配的 JSON 属性名称。

下面是 @JsonProperty 注解的基本使用方法:

1
2
3
4
5
6
public class MyClass {
@JsonProperty("fieldNameInJson")
private String myField;

// 省略其它代码
}

在这个例子中,@JsonProperty("fieldNameInJson") 指定了 myField 属性在 JSON 对象中的名称应为 “fieldNameInJson”。因此,在序列化为 JSON 时,这个属性会以指定的名称出现;在从 JSON 反序列化为 Java 对象时,Jackson 库会尝试寻找 “fieldNameInJson” 对应的属性值并赋给 myField

这个注解为我们提供了一种简单而强大的方式来管理 Java 对象与 JSON 表示之间的映射关系,能够解决对象属性命名与 JSON 属性命名不一致的问题。


FastJson常用方法总结
http://wahoyu.xyz/2023/10/21/JSONObject/
作者
Wahoyu
发布于
2023年10月21日
许可协议