2024-12-31 16:23阅读: 35评论: 0推荐: 0

fastjson 序列化踩坑

坑1:包含转义符的子对象反序列化

场景

这样一个 json 字符串

[ {
"value" : "定位标志:0,GPS:9,POWER:1,GSM:15",
"name" : "positionType",
"metadata" : "{\"timestamp\":1735119664668}"
} ]

这个 json 字符串是如何产生的?
metadata 对应的是一个由 Java 对象序列化得到的 json 字符串,这个字符串本身就包含了""
当使用 RedisTemplate 用 String 形式写入 Redis 存储时会对""进行转义
理论上再使用 RedisTemplate 将其读出的时候会自动处理转义符
但是由于一组操作的原子性考量我使用了 Lua 脚本去读,这样就是存储的原样读取没有处理转义符

问题

问题在哪里?

通常来说这两种写法是等价的

// 第一种
JSON.parseArray(propertiesStr).stream()
.map(jsonObject -> JSONObject.toJavaObject((JSONObject) jsonObject, PropertyDTO.class))
.toList();
// 第二种就是上面写法的优化简化版本,通常是这样
JSON.parseArray(propertiesStr, PropertyDTO.class);

但事实上对于我上面给到的子对象带转义符的 json 字符串,第一种没问题,第二种会报错

无论我将 metadata 的类型定义为对象还是 String 都会报错

为什么?

如何应对?

坑2:序列化和反序列化遇上多态

场景

Son son = new Son(21, "张三");
// 问题1:父类引用指向子类对象,然后序列化父类得到的是否包含子类属性
Father father = son;
System.out.println(JSON.toJSONString(father));
// 问题2:子类子字符串反序列化为父类是否会失败报错?
String sonStr = JSON.toJSONString(son, SerializerFeature.WriteClassName);
Father father2 = JSON.parseObject(sonStr, Father.class);

问题

答案是什么?

1 会成功,序列化父类引用得到的 json 字符串包含了子类所有的属性

2 会报错

为什么?

如何应对?

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/18644253

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(35)  评论(0编辑  收藏  举报
历史上的今天:
2022-12-31 计挑-国赛-C++-题5
2022-12-31 计挑-国赛-Java-题5
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起