使用TypeReference<T>避免JSON.parseObject()运行时的“隐藏”类型擦除

在Java中,由于泛型的类型信息在运行时被擦除,直接使用Class对象传递给JSON.parseObject()解析包含泛型的JSON字符串会导致类型转换错误。解决方法是利用TypeReference来保存泛型信息,确保能正确转换JSON中的列表类型字段。

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

如果你在调用JSON.parseObject()方法时,直接传入了一个Class类型的参数,而没有使用TypeReference,那么在解析包含泛型信息的JSON字符串时可能会出现问题。这是因为在Java中,泛型信息是在编译期间进行类型擦除的,运行时并没有保留泛型信息。

举个例子,假设你有一个Person类,其中有一个属性类型是List,你将一个包含Person对象的JSON字符串传给JSON.parseObject()方法,并尝试将其转换成Person对象。如果你在调用JSON.parseObject()方法时,使用了.class的方式来获取Person类的Class对象,例如:

String jsonStr = "{\"name\":\"Alice\", \"hobbies\":[\"swimming\", \"reading\"]}";
Person person = JSON.parseObject(jsonStr, Person.class);

则在运行时,JSON.parseObject()方法会尝试将JSON字符串中的hobbies字段转换成一个List类型的对象。但是由于泛型信息在运行时已经被擦除了,因此它并不知道该如何创建一个List类型的对象,而是会默认创建一个List类型的对象。这样的话,person对象的hobbies属性就会被赋值为一个List对象,而不是一个List对象。

为了解决这个问题,我们需要使用TypeReference类型的对象来告诉JSON.parseObject()方法该如何进行类型转换。TypeReference实际上是一个抽象类,我们可以通过继承它并实现其中的TypeReference#getType()方法,来创建一个匿名类对象,该对象的getType()方法可以返回一个具体的泛型类型。例如,对于上面的例子,我们可以这样写:

String jsonStr = "{\"name\":\"Alice\", \"hobbies\":[\"swimming\", \"reading\"]}";
Person person = JSON.parseObject(jsonStr, new TypeReference<Person>() {});

这样,JSON.parseObject()方法就可以根据TypeReference中的泛型信息,正确地将hobbies字段转换成一个List类型的对象,从而得到正确的person对象。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值