淘先锋技术网

首页 1 2 3 4 5 6 7

目前数据交互中最常用的数据交互格式莫过于json了,那么在java开发中经常会遇到json的序列化与反序列化,常用的json序列化工具有阿里的Fastjson、spring mvc内置的Jackson、还有谷歌的Gson。

GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符串转成一个Java对象,或者将一个Java对象转化为Json字符串。

 Gson特点:1:面向对象;2:简洁高效;3:数据传递和解析方便

下面介绍一下Gson的用法
1.首先引入依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
</dependency>

2.用来做示例的实体类Student的代码,如下:

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    /* 姓名*/
    private String name;
    /* 性别*/
    private String sex;
    /* 年龄*/
    private Integer age;
}

3.public String toJson(Object src);
方法作用:把实体对象转换为json(序列化)

import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        //创建实体类
        Student student = new Student("Tom", "男", 25);
        Student student1 = new Student("Jerry", "女", 23);
        //实例化Gson
        Gson gson = new Gson();
        //把对象序列化为json
        String s = gson.toJson(student);
        System.out.println("student对象序列化后的结果为:"+s);

        //定义List集合
        List<Student> studentList = new ArrayList<>();
        studentList.add(student);
        studentList.add(student1);
        String s1 = gson.toJson(studentList);
        System.out.println("List集合序列化后的结果为:"+s1);

        Map<String, Student> studentMap = new HashMap<>();
        s;tudentMap.put("student",student);
        studentMap.put("student1",student);
        System.out.println("Map集合序列化后的结果为:"+studentMap);
    }
}

输出如下:

student对象序列化后的结果为:{"name":"Tom","sex":"男","age":25}
List集合序列化后的结果为:[{"name":"Tom","sex":"男","age":25},{"name":"Jerry","sex":"女","age":23}]
Map集合序列化后的结果为:{student=Student(name=Tom, sex=男, age=25), student1=Student(name=Tom, sex=男, age=25)}

4.public T fromJson(String json, Type typeOfT)
方法作用:
(1)把json转换为List对象(反序列化)

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        // 定义json
        String json = "[{\"name\":\"Jerry\",\"sex\":\"女\",\"age\":23}]";
        //实例化Gson
        Gson gson = new Gson();
        //把json序列化为List对象
        List<Student> o = gson.fromJson(json, new TypeToken<List<Student>>() {
        }.getType());
        System.out.println(json);
        System.out.println("反序列化成List后的结果为:"+o.toString());
    }
}

输出为:

[{"name":"Jerry","sex":"女","age":23}]
反序列化成List后的结果为:[Student(name=Jerry, sex=女, age=23)]

(2)把json转换为Map对象(反序列化)

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.util.HashMap;

public class Main {
    public static void main(String[] args) {
        //实例化Gson
        Gson gson = new Gson();
        //定义json
        String jsonMap = "{'序列化测试':{name='Tom', sex='男', age=25}}";
        //把json序列化为Map对象
        HashMap<String,Student> o1 = gson.fromJson(jsonMap, new TypeToken<HashMap<String,Student>>() {
        }.getType());
        System.out.println("反序列化成Map后的结果为:"+o1);
    }
}

输出为:

(3)把json转换为实体对象(反序列化)

import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        // 定义json
        String json = "{\"name\":\"转换对象\",\"sex\":\"女\",\"age\":20}";
        //实例化Gson
        Gson gson = new Gson();
        //把json序列化为实体类(Test)对象
        Student student = gson.fromJson(json, Student.class);
        //输出---反序列化后的结果为:StudentEntity{name='转换对象', sex='女', age=20}
        System.out.println("反序列化成实体类后的结果为:"+student.toString());
    }
}

输出为:

注意事项:

一、把实体类序列化为json时,如果实体类某个属性的值为null,gson在序列化该对象是则默认过滤掉该属性,该属性不会参与序列化。

二、反序列化时需注意json串的格式,如果是数组则最外层是用‘[ ]’来包括的,如果是对象或者是Map则是用‘{}’来包括的,根据需要反序列化的json格式来选定需要反序列化用的方法gson.fromJson()应该传递哪种参数,反序列化成对象参数应该是这个对象的反射(entity.Class),如果是List或者是Map,参数则是泛型。