Gson的使用

本文介绍了如何使用Gson进行JSON序列化与反序列化,并通过Maven简化依赖管理。展示了基本数据类型、List和复杂对象的转换示例。

在说GSON前,先说一下这个maven和Junit.

maven这个工具确实挺好用的,以前我都是用maven写个pom.xml文件然后下载到文件夹里,再buildPath,但这次用idea的maven工程,直接吧需要的jar包放在pom文件下然后ctrl+S就自动给我导入jar包完毕了,不错。

既然用的maven,junit用的就是最新版,不过这4.11这个版本增加了新的jar包,需要新的jar包(hamcrest-all)下面是我的pom.xml

    <dependencies>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.4</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.hamcrest/hamcrest-all -->
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-all</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
首先贴一下Gson的简单使用。Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法。这两个方法为我们提供了很方便的序列化和反序列化。但下面的只是针对于基础数据类型的操作。

    Gson gson = new Gson();
    @Test
    public void test() {
        String hello = gson.toJson("Hello");
        String num = gson.toJson(123);
        Student stu = new Student("zhangsan", 22);
        String cla = gson.toJson(stu);
        System.out.println(hello);
        System.out.println(num);
        System.out.println(cla);
        Student newStu = gson.fromJson(cla, Student.class);
        System.out.println(newStu.toString());
    }

下面是List的操作

    @Test
    public void testArray() {
        Room room = new Room();
        room.addStudent();
        System.out.println(room.getSize());
        String roomString = gson.toJson(room);
        System.out.println(roomString);
        Room room2 = gson.fromJson(roomString, Room.class);
        System.out.println(room2.toString());
    }
最后就是我想说的,Gson有个特别的地方,就是他能吧不知道的数据转换成List<Map>形式,这样用起来就很方便了下面看示例。


    @Test
    public void testList() {
        List<Room> roomList = new ArrayList<Room>();
        for (int i = 0; i < 100; i++) {
            Room room = new Room();
            room.addStudent();
            roomList.add(room);
        }
        String roomListString = gson.toJson(roomList);
        System.out.println(roomListString + "\n");
        List<Room> roomList2 = gson.fromJson(roomListString, ArrayList.class);
        roomListString = gson.toJson(roomList2);
        System.out.println(roomListString + "\n");


        List<Map<String, Object>> list = (List<Map<String, Object>>) gson.fromJson(roomListString, ArrayList.class);

        System.out.println(list.size());
        System.out.println(list.get(0).get("stuList"));
        for (String key : list.get(1).keySet()) {
            System.out.print(key);
        }

    }







Gson是一个用于处理JSON数据的Java库,以下是其使用方法和指南: ### 环境配置与依赖管理 若使用Maven项目,可在`pom.xml`文件中添加以下依赖: ```xml <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>你选择的版本号</version> </dependency> ``` 若不使用Maven,可从`http://mvnrepository.com/artifact/com.google.code.gson/gson`选择版本,进入下载jar文件 [^2]。 ### 基本序列化/反序列化操作 #### 序列化(Java对象转JSON) ```java import com.google.gson.Gson; class Person { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } } public class SerializationExample { public static void main(String[] args) { Person person = new Person("John", 30); Gson gson = new Gson(); String json = gson.toJson(person); System.out.println(json); } } ``` #### 反序列化(JSON转Java对象) ```java import com.google.gson.Gson; class Person { String name; int age; } public class DeserializationExample { public static void main(String[] args) { String json = "{\"name\":\"John\",\"age\":30}"; Gson gson = new Gson(); Person person = gson.fromJson(json, Person.class); System.out.println(person.name + " - " + person.age); } } ``` ### JSON元素类型与Java类型映射关系 | JSON元素类型 | Java类型 | | ---- | ---- | | JSON对象 | Java类 | | JSON数组 | Java数组或`List` | | JSON字符串 | `String` | | JSON数字 | `int`、`long`、`double`等 | | JSON布尔值 | `boolean` | | JSON null | `null` | ### GsonBuilder的详细配置选项和自定义功能 GsonBuilder可用于自定义Gson的行为,例如设置日期格式、排除字段等。 ```java import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.util.Date; class Person { String name; Date birthDate; public Person(String name, Date birthDate) { this.name = name; this.birthDate = birthDate; } } public class GsonBuilderExample { public static void main(String[] args) { GsonBuilder gsonBuilder = new GsonBuilder(); gsonBuilder.setDateFormat("yyyy-MM-dd"); Gson gson = gsonBuilder.create(); Person person = new Person("John", new Date()); String json = gson.toJson(person); System.out.println(json); } } ``` ### Gson常用注解 #### `@SerializedName` 用于指定JSON字段名与Java字段名的映射。 ```java import com.google.gson.annotations.SerializedName; class Person { @SerializedName("full_name") String name; int age; } ``` #### `@Expose` 用于指定哪些字段需要序列化或反序列化。 ```java import com.google.gson.annotations.Expose; class Person { @Expose String name; @Expose(serialize = false, deserialize = false) int age; } ``` ### TypeToken的使用 当处理泛型类型时,可使用`TypeToken`。 ```java import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.List; public class TypeTokenExample { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); Gson gson = new Gson(); String json = gson.toJson(list); Type listType = new TypeToken<List<String>>() {}.getType(); List<String> newList = gson.fromJson(json, listType); System.out.println(newList); } } ``` ### TypeAdapter的使用 `TypeAdapter`可用于自定义序列化和反序列化逻辑。 ```java import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import java.io.IOException; class Person { String name; int age; } class PersonTypeAdapter extends TypeAdapter<Person> { @Override public void write(JsonWriter out, Person person) throws IOException { out.beginObject(); out.name("name").value(person.name); out.name("age").value(person.age); out.endObject(); } @Override public Person read(JsonReader in) throws IOException { Person person = new Person(); in.beginObject(); while (in.hasNext()) { switch (in.nextName()) { case "name": person.name = in.nextString(); break; case "age": person.age = in.nextInt(); break; } } in.endObject(); return person; } } ``` ### @JsonAdapter的使用 `@JsonAdapter`可用于指定自定义的`TypeAdapter`。 ```java import com.google.gson.annotations.JsonAdapter; @JsonAdapter(PersonTypeAdapter.class) class Person { String name; int age; } ``` ### JsonDeserializer和JsonSerializer的使用 `JsonDeserializer`和`JsonSerializer`可用于自定义反序列化和序列化逻辑。 ```java import com.google.gson.*; import java.lang.reflect.Type; class Person { String name; int age; } class PersonDeserializer implements JsonDeserializer<Person> { @Override public Person deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { JsonObject jsonObject = json.getAsJsonObject(); Person person = new Person(); person.name = jsonObject.get("name").getAsString(); person.age = jsonObject.get("age").getAsInt(); return person; } } class PersonSerializer implements JsonSerializer<Person> { @Override public JsonElement serialize(Person src, Type typeOfSrc, JsonSerializationContext context) { JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("name", src.name); jsonObject.addProperty("age", src.age); return jsonObject; } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值