怎么序列化继承自HashMap的bean为Json?

发布于 2022-09-05 23:48:33 字数 535 浏览 23 评论 0

User实体

public class User extends HashMap<String, Object>
{
    private String name;

    public String getName()
    {
        return this.name;
    }

    public void setName(String name)
    {
        this.name = name;
    }
}

user对象

{
        User user = new User();
        user.setName("123");
        user.put("address", "北京");
        user.put("phone", "110");
}

使用jackson或gson序列化后name的值没有了

{"address":"北京","phone":"110"}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

得不到的就毁灭 2022-09-12 23:48:33

jackson解析的时,会获取父类的Class类型来执行不同解析实现类,而User继承了HashMap,他的解析实现类是MapSerializer!而MapSerializer解析时,不会序列自身的属性!只会序列自身存储的Entry[](HashMap内的一个存储数据的数组)数组!自然就没有序列到User类的name!

clipboard.png

想要序列name,可以将User类改成以下

class User extends HashMap<String, Object> {
    private String name;
    
    public User() {
        super();
    }

    public String getName(){
        return super.get(name);
    }

    public void setName(String key, String name){
        super.put(key, name);
    }
}
鹿港巷口少年归 2022-09-12 23:48:33

很尴尬,既然继承了hashmap,把name put进去不就可以了。
还有一个问题 ,为啥要继承hashmap?
如果你仅仅是想把user实体转化成名值队的形式的话,不用继承hashmap也是可以的。

能否归途做我良人 2022-09-12 23:48:33

看到了楼主的回复,楼主的需求感觉类似扩展字段的意思。
我们一般就用字符类型进行存储,在bean里面定义为String类型,然后将JSON对象转换成JSON字符串存储在里面,需要使用的时候,取出JSON字符串,然后在前端或者后台代码里将JSON字符串反序列化为JSON对象。

clipboard.png

==============================华丽的分割线==============================
昨天也看到了楼主的帖子,想问一下楼主需要定义这样的数据结构的目的是啥?这样的话看看能不能给出更合适的答案。

〃安静 2022-09-12 23:48:33

楼主也可以使用这种方法
1.定义一个接口,如下
public interface IJsonObject {

Object toJson();

}
2.User类实现该接口并实现方法
public class User implements IJsonObject {

private String username;
private String pssword;
private String email;
private String age;

public Object toJson() {
    Map<String, Object> jsonMap = new HashMap<>();
    jsonMap.put("username", username);
    jsonMap.put("email", email);
    jsonMap.put("age", age);
    return jsonMap;
}

}
3.这样就可以选择性的序列化了,把需要序列化的属性定义在该方法中即可.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文