记录:一句注解实现fastjson自省功能

本文记录了一次使用Fastjson处理JSON数据时遇到的问题及解决方案。项目中由于DTO类的继承关系,导致通过Feign调用服务返回的JSON数据丢失子类特有的字段。原因是JSON标准不支持自省,无法标识具体类型。通过在DTO类上添加`@TypeAlias`注解,Fastjson能够识别并保留子类字段,实现了自省功能。对于成员变量为对象引用的情况,可能需要对引用类也添加相同注解,但未实际验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

懒癌晚期,事情过去很久了才终于要记录。
事情的起因是这样的:
项目中有若干dto,其中一个父类dto,是基类,若干子类dto,是子类,大概是这个意思(直接在csdn编辑器里手敲代码,格式凑合看吧。。):

public class FatherDto implements Serializable {
	private String fatherOne;
	
	private String fatherTwo;

	//序列化id,无参构造方法,get/set方法全部略
}
public class SonDtoOne extends FatherDto{
	private String sonOne;
	//序列化id,无参构造方法,get/set方法全部略
}
public class SonDtoTwo extends FatherDto{
	private String sonTwo;
	//序列化id,无参构造方法,get/set方法全部略
}

然后,有个接口,通过feign去调用某个服务方法,返回的数据类型是List<FatherDto>,而实际上在服务方法实现中向list中加入的元素有可能是父类,也有可能是子类。
问题来了,通过rest调用接口,返回的数据元素里只有父类FatherDto的字段,子类中的独有字段全都不见了。
问题就在于,JSON标准是不支持自省的,它不标记类型,你不知道它是什么类型
项目中用的fastjson,解决方案:在dto实体类上统一加上如下注解:

@JSONType(serialzeFeatures = { SerializerFeature.WriteClassName })

加上这个之后,就可以标注类型了,再调用服务返回的元素,子类字段就都会出现了。
值得一提的是,我上面写的这些类,成员变量都是基本类型的,如果成员变量是其他对象的引用,个人感觉也应该对变量所属的类上也加上这个注解,这个我没有试过。

后来百度了一下,这个叫做“自省功能”,特此记录一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值