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

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数据会丢失

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实体类继承HashMap是指创建一个新的类,该类继承HashMap,并添加了额外的属性和方法。在Java中,可以通过创建一个继承HashMap的类来实现这一目的。例如,可以创建一个名为R的类,该类继承HashMap,并添加一个泛型属性data。代码示例如下: ```java @Data @EqualsAndHashCode(callSuper = true) public class R<T> extends HashMap<String, Object> implements Serializable { private T data; } ``` 在这个示例中,R类继承HashMap,并添加一个名为data泛型属性。通过继承HashMap,R类可以继承HashMap的所有方法和属性,并且可以在此基础上进行扩展和定制。同时,R类还使用了Lombok库中的@Data和@EqualsAndHashCode注解,这些注解可以自动生成getter、setter、equals和hashCode等方法。 引用\[1\]提供了一个示例代码,展示了如何创建一个继承HashMap的实体类R,并添加一个泛型属性data。 #### 引用[.reference_title] - *1* [继承HashMap导致的Json序列化问题](https://blog.csdn.net/zry19950714/article/details/115604875)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [HashMap](https://blog.csdn.net/qq_60275529/article/details/124843906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值