淘先锋技术网

首页 1 2 3 4 5 6 7

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,因为

会自动调用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());

    }

在这里插入图片描述