首页 > 技术文章 > JSON和GSON

RainASnow 2021-12-25 18:19 原文

在没有学习fastjson前,不知道JSON和GSON的区别。
JSON来源:在JAVA中,我们的对象携带了数据,如果要把对象中的数据传输给前端,可以使用XML文件,但是XML文件烦琐而且速度慢,JSON可以完美取代XML文件。JSON是JAVAScript的子集,使用JSON自然更加快。
JSON本质:JSON本质是一种文本格式。可以理解成前后端传输数据的协议。
JSON文本组成:"{}" "[]" "," ":"一共六个字符,可以包括空格、回车。{}表示对象,[]表示对象组成的数组,","用来分隔对象,":"用来分隔键值对。

GSON:和JSON一字之差,但是概念完全不同。GSON全名为Goole JSON,使用JAVA编写的代码,功能是将JAVA对象转换成JSON格式文本(序列化)和将JSON格式文本转换成JAVA对象(反序列化)。一个功能可能有不同的代码产品,alibaba的fastjson和json就是同类竞品,fastjson据说要比GSON快6倍。

根据后端语言的使用,我们可以使用不同语言对应功能,比如将JSON格式文本转换成PHP对象,或者转换成其他语言对象。
来个fastjson的使用案例:
首先我们下载相应的jar包并配置classpath,然后我们新建bean

public class Group {

    private Long       id;
    private String     name;
    private List<User> users = new ArrayList<User>();

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public void addUser(User user) {
        users.add(user);
    }

    @Override
    public String toString() {
        return "Group{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", users=" + users +
                '}';
    }
}
public class User {

    private Long   id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

来个测试

public class Test {
    public static void main(String[] args) {
        //序列化
        Group group = new Group();
        group.setId(0L);
        group.setName("admin");

        User guestUser = new User();
        guestUser.setId(2L);
        guestUser.setName("guest");

        User rootUser = new User();
        rootUser.setId(3L);
        rootUser.setName("root");

        group.addUser(guestUser);
        group.addUser(rootUser);

        String jsonString = JSON.toJSONString(group);

        System.out.println(jsonString);

        //反序列化
        //"{}"表示对象,"[]"表示对象数组(List),一定要有getter和setter。
        String jsonString1 = "{\"id\":0,\"name\":\"admin\",\"users\":[{\"id\":2,\"name\":\"guest\"},{\"id\":3,\"name\":\"root\"}]}";
        Group group1 = JSON.parseObject(jsonString1, Group.class);
        System.out.println(group1.getUsers().get(0).toString());
        System.out.println(group1.toString());

        //处理时间
        Date date = new Date(System.currentTimeMillis());
        System.out.println(JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS"));
        System.out.println(JSON.toJSONString(date, SerializerFeature.UseISO8601DateFormat));
        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";
        System.out.println(JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat));

    }
}

注意:在序列化中,我们的bean属性只能是String、数值类型、List数组,数值最好设置为long,不容易溢出。我们必须设置getter和setter,如果属性中有数组,还要有一个数组添加元素的方法,而且List必须实例化。在反序列化中,JSON格式的字符串中的键必须和对象的属性相同,否则对象属性将被赋值为空,数组属性为[]。
在JAVA中,"使用\转义。

推荐阅读