继承HashMap的R内部添加一个拥有泛型的data保存数据,data丢失的问题

博客探讨了在Java中,当一个类如`R`继承`HashMap`并在调试或打印时,其成员变量`data`无法直接显示的问题。原因是`toString()`方法只显示Map内容,而非对象的所有属性。在转化为JSON字符串时,由于`R`被视为Map,导致`data`字段丢失。源码分析指出,对象被强制转换为Map,JSON转换器未能处理非Map属性,从而在转换过程中忽略了`data`。
摘要由CSDN通过智能技术生成

R的核心代码:

public class R<T> extends HashMap<String, Object> {
    private static final long serialVersionUID = 1L;
    @Setter
    @Getter
    T data;

    public R() {
        put("code", 0);
        put("msg", "success");
    }
}

注意:如果调试的时候不会直接显示这个data的值
在这里插入图片描述

这是因为idea在调试的时候,在这里显示的数据是通过调用对象的toString方法实现的,而R继承了HashMap,hashmap重写的toString方法只会显示map里面的内容,不会显示data的数据,但是这并不代表data没有值

我们打印出来的值也没有data这个属性,因为sout打印对象时,也是调用的对象的toString方法,但是我们却可以通过getData拿到这个data的值,所以其实data的值在这里面,只是没有打印出来,并且解析成JSON字符串后,这个值也没有出现,因而我们在使用Spring返回这个对象作为返回值时,拿不到这个data,从而会造成错误,我们深入源码,分析一下原因
在这里插入图片描述
我们进入toJSONString的源码

在这里插入图片描述

我们可以看到,我们返回的json字符串来此writer,所以我们着重关注对writer进行的一些操作

首先会根据这个对象的类型,拿到对应的JSON转换器,Map类型有Map类型的转换器,普通对象有普通对象的转换器,而因为R继承了HashMap,是map型的变量,所以会得到一个用于转换map的转换器,这也就是问题的所在

        Class<?> valueClass = object.getClass();
        ObjectWriter objectWriter = context.getObjectWriter(valueClass, valueClass);

我们继续往下看,进入这个write方法

在这里插入图片描述
来到这个方法后,我们就可以看到data丢失的原因,在将对象转换为JSON字符串前,会将这个对象强制转换为Map类型的变量,然后后面遍历这个map,对递归地往writer里面写入数据,来实现json格式的字符串的转换,而由于此时的R已经被强制转换为了Map类型的变量,因而JSON在处理的时候看不到data这个数据,只是将其当成一个普通的map来处理,所以转换为JSON的时候,data数据会丢失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值