Gson 使用详解

该文章已生成可运行项目,

Gson 使用详解

Gson 是 Google 提供的 Java 库,用于 JSON 和 Java 对象之间的相互转换。它提供了简单的 API,可以轻松实现:

  • Java 对象 → JSON 字符串(序列化)
  • JSON 字符串 → Java 对象(反序列化)

1. 基本用法

(1)添加 Gson 依赖

Maven
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.10.1</version> <!-- 使用最新版本 -->
</dependency>
Gradle
implementation 'com.google.code.gson:gson:2.10.1'

(2)基本转换示例

① Java 对象 → JSON(序列化)
import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        // 创建 Java 对象
        Person person = new Person("张三", 25);

        // 使用 Gson 转换为 JSON
        Gson gson = new Gson();
        String json = gson.toJson(person);

        System.out.println(json);
        // 输出: {"name":"张三","age":25}
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
② JSON → Java 对象(反序列化)
import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"李四\",\"age\":30}";

        Gson gson = new Gson();
        Person person = gson.fromJson(json, Person.class);

        System.out.println(person.getName()); // 输出: 李四
        System.out.println(person.getAge()); // 输出: 30
    }
}

class Person {
    private String name;
    private int age;

    // 必须有无参构造方法或匹配的构造方法
    public Person() {}

    public String getName() { return name; }
    public int getAge() { return age; }
}

2. 进阶用法

(1)处理复杂对象(嵌套、List、Map)

① 嵌套对象
class Address {
    private String city;
    private String street;
    // getters & setters
}

class User {
    private String name;
    private Address address;
    // getters & setters
}

// 转换示例
User user = new User();
user.setName("Alice");
user.setAddress(new Address("北京", "长安街"));

Gson gson = new Gson();
String json = gson.toJson(user);
// 输出: {"name":"Alice","address":{"city":"北京","street":"长安街"}}
② 处理 List 和 Map
List<String> hobbies = Arrays.asList("篮球", "音乐", "编程");
Map<String, Integer> scores = Map.of("数学", 90, "英语", 85);

Gson gson = new Gson();
String jsonList = gson.toJson(hobbies);
// 输出: ["篮球","音乐","编程"]

String jsonMap = gson.toJson(scores);
// 输出: {"数学":90,"英语":85}

(2)自定义序列化和反序列化

① 使用 JsonSerializerJsonDeserializer
import com.google.gson.*;

public class DateAdapter implements JsonSerializer<Date>, JsonDeserializer<Date> {
    private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    public JsonElement serialize(Date date, Type type, JsonSerializationContext context) {
        return new JsonPrimitive(format.format(date));
    }

    @Override
    public Date deserialize(JsonElement json, Type type, JsonDeserializationContext context) throws JsonParseException {
        try {
            return format.parse(json.getAsString());
        } catch (ParseException e) {
            throw new JsonParseException(e);
        }
    }
}

// 使用方式
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new DateAdapter())
        .create();

Date now = new Date();
String json = gson.toJson(now); // "2023-10-01"
Date parsedDate = gson.fromJson("\"2023-10-01\"", Date.class);
② 使用 @SerializedName 注解(字段名映射)
class User {
    @SerializedName("user_name") // JSON 字段名是 "user_name"
    private String name;

    @SerializedName("user_age")
    private int age;
}

// JSON: {"user_name":"张三","user_age":25}
// 会被映射到 User 对象的 name 和 age 字段

(3)格式化 JSON(美化输出)

Gson gson = new GsonBuilder()
        .setPrettyPrinting() // 美化输出
        .create();

String json = gson.toJson(user);
System.out.println(json);

输出:

{
  "name": "张三",
  "age": 25,
  "address": {
    "city": "北京",
    "street": "长安街"
  }
}

3. 常见问题

(1)Gson 和 FastJson 对比

特性GsonFastJson
开发者Google阿里巴巴
性能中等更快
安全性曾曝出漏洞
易用性简单更灵活
社区支持广泛国内流行

(2)Gson 处理特殊数据类型

  • null:默认会被忽略,可用 .serializeNulls() 强制输出:
    Gson gson = new GsonBuilder().serializeNulls().create();
    
  • 枚举(Enum):默认使用 name() 方法,可自定义适配器。

4. 总结

  • 基本转换toJson()fromJson()
  • 复杂对象:支持嵌套、ListMap
  • 自定义适配器JsonSerializerJsonDeserializer
  • 注解支持@SerializedName 用于字段映射。
  • 格式化setPrettyPrinting() 让 JSON 更易读。
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值