json序列化与反序列化

json序列化与反序列化

应用场景

在开发过程中,需要通过网关,网关限制了输入、输出的格式,所以需要将实体转换为map格式,因此对json的序列化与反序列化进行总结
开发环境

fastjson

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.57</version>
</dependency>

实体转json

@Test
public void testJson(){
    User user1 = new User();
    user1.setName("zhangsan");
    user1.setSex("1");

    //实体转json
    JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user1));
    System.out.println(jsonObject);
}

输出:

{“sex”:“1”,“name”:“zhangsan”}

Process finished with exit code 0

实际上输出的是JSON的toString,因为

System.out.println(jsonObject);

会自动调用toString。

json序列化

转换格式:jsonObject => String

    @Test
    public void testJson(){
        User user1 = new User();
        user1.setName("zhangsan");
        user1.setSex("1");

        //实体转json
        JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(user1));
        System.out.println("实体转json:    "+jsonObject);
        //json序列化
        System.out.println("json序列化:    "+jsonObject.toJSONString());
    }

实体转json: {“sex”:“1”,“name”:“zhangsan”}
json序列化: {“sex”:“1”,“name”:“zhangsan”}

Process finished with exit code 0

实体和map的转换

实体:

public static class User{
    private String name;
    private String sex;

    public String getName() {
        return name;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}

加静态的原因是私有非静态方法不能进行转换,实际应用中都是单独的实体类。

@Test
public void testJson(){
    User user1 = new User();
    user1.setName("zhangsan");
    user1.setSex("1");

    //实体转map
    Map map = JSON.parseObject(jsonObject.toJSONString(user1), Map.class);
    System.out.println("实体转map:    "+map);

}

实体转map: {sex=1, name=zhangsan}

@Test
public void testJson(){
    User user1 = new User();
    user1.setName("zhangsan");
    user1.setSex("1");

    //实体转map
    Map map = JSON.parseObject(jsonObject.toJSONString(user1), Map.class);
    System.out.println("实体转map:    "+map);
    //map转实体
    User user = JSON.parseObject(jsonObject.toJSONString(map), User.class);
    System.out.println("map转实体:    "+user);

}

实体转map: {sex=1, name=zhangsan}
map转实体: com.compressfile.demo.utils.ZipUtilsTest$User@ec756bd

泛型实体转换

在实际应用中,我们经常用到带有泛型的实体,使用上述方法并不能实现json的序列化与反序列化(有兴趣可以自己试试,当然你要搜到这个肯定是遇到了同样的问题)

正确实现方法:

泛型实体:

private static class Store<T>{
    private T person;
    private String storeName;

    public T getPerson() {
        return person;
    }

    public void setPerson(T person) {
        this.person = person;
    }

    public String getStoreName() {
        return storeName;
    }

    public void setStoreName(String storeName) {
        this.storeName = storeName;
    }
}

尝试转换

    @Test
    public void testJson(){
        User user1 = new User();
        user1.setName("zhangsan");
        user1.setSex("1");

        Store<User> store = new Store<>();
        store.setPerson(user1);
        store.setStoreName("今天成为大神了吗");
        System.out.println(JSON.toJSONString(store));
        Store store1 = JSON.parseObject(JSON.toJSONString(store), Store.class);
        User person = (User) store1.getPerson();
        System.out.println(person.getName());


    }

在这里插入图片描述

可以看出,当我们尝试直接转换的时候会报错,因为带泛型的实体转换不出泛型

正确实现:

    @Test
    public void testJson() {
        User user1 = new User();
        user1.setName("zhangsan");
        user1.setSex("1");

        Store<User> store = new Store<>();
        store.setPerson(user1);
        store.setStoreName("今天成为大神了吗");
        System.out.println(JSON.toJSONString(store));

        Store<User> store1 = JSON.parseObject(JSON.toJSONString(store), new TypeReference<Store<User>>() {
        });
        User person = (User) store1.getPerson();
        System.out.println(person.getName());

    }

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值