首页 > 其他分享 >fastjson 序列化踩坑

fastjson 序列化踩坑

时间:2024-12-31 16:31:43浏览次数:6  
标签:fastjson 子类 JSON json 报错 字符串 序列化

坑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 会报错

为什么?

如何应对?

标签:fastjson,子类,JSON,json,报错,字符串,序列化
From: https://www.cnblogs.com/yaocy/p/18644253

相关文章

  • 序列化 FlatBuffers & protobuf
    序列化FlatBuffers&protobuf1.FlatBuffers源码:FlatBuffers指南:FlatBuffersProgrammer’sGuide结构定义文件为.fbs,注释使用//,可以使用include"my.fbs"嵌套包含文件可以理解为轻量级的protobuf,不会依赖library,但是编码会复杂一些FlatBuffers的特点是先构造......
  • java JSONObject序列化包含Date类型数据的Java对象
    javaJSONObject序列化包含Date类型数据的Java对象|Id|Title|DateAdded|SourceUrl|PostType|Body|BlogId|Description|DateUpdated|IsMarkdown|EntryName|CreatedTime|IsActive|AutoDesc|AccessPermission||-------------|-------------|------......
  • UE4.27, 揣摩源码, 序列化 (四) 应用
    4.runtime-UObject正反序列化4.1UObject序列化//toolload FAssetToolsModule&AssetToolsModule=FModuleManager::Get().LoadModuleChecked<FAssetToolsModule>("AssetTools"); //pathsolve FStringAssetName,Pack......
  • UE4.27, 揣摩源码, 序列化 (三) FLinkerLoad, FLinkerSave
    3.  FLinkerLoad,FLinkerSave分别是UObject的反序列化和序列化的内核3.0.UPackage与UObjectUObject因为涉及与其他UObject的复杂引用关系,如果我们客制化地单独正反序列化每一个UObject,我们会在反序列化的时候惊觉这是繁琐而不可能的。为了满足UObject......
  • JSON字符串反序列化 动态泛型
    需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成JSON字符串,然后JSON反序列化成对象,然后反射调用目标方法时这样的:CommandRespsendXXX(BaseCommandApiDTO<XXX>baseCommandApiDTO);方式一:FastJsonClassmainBody=Class.forName(entity.ge......
  • DRF之序列化器【3】数据校验
    目录前言1.基本校验2.内置和正则校验3.钩子校验4.Model校验5.保存数据之普通字段6.保存数据之FK和M2M字段7.数据校验总结总结前言在前两篇文章我们已经介绍了序列化器的序列化数据的功能以及源码实现,本文将接着介绍它的数据校验功能以及数据保存。序列化器......
  • Oracle WebLogic Server反序列化漏洞(CVE-2024-21216)
    免责声明请勿使用本文中提到的技术进行非法测试或行为。使用本文中提供的信息或工具所造成的任何后果和损失由使用者自行承担,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。一、简介WebLogic是一款由BEA系统公司开发的JavaEE应用服务器,现由Oracle......
  • UE4.27, 揣摩源码, 序列化 (二) FBitReader, FBitWriter
    2. 继续看bit序列化,这个设计是网络传输的关键一环//FBitReader, FBitWriter这两个类仅被网络相关的事务使用//Thisclassisexclusivelyusedbythenetcode2.1.SVO和array的正反序列化相同,内部都存在着,对类型是TAarry<uint8>的字节单位的内存的处理......
  • UE4.27, 揣摩源码, 序列化 (一) FArrayReader, FArrayWriter
    1.从ArrayReader.h和ArrayWriter.h开始1.1.SVO为了减少误解,介绍一下SVO这里的read和write的主词都是array,宾语都是memory所以前者是从内存读出array,后者是将array写入内存1.2.关键继承关系FArrayReader,FArrayWriterc......
  • DRF之序列化器【2】源码流程
    目录前言1.流程概述2.创建字段对象3.创建类4.实例化类5.序列化过程5.1UserSerializer类5.2ListSerializer类6.总结前言序列化器是Django框架中的一个重要概念,用于在Python对象和JSON等格式之间进行相互转换。通过序列化器,我们可以方便地将模型实例转换为JS......