首页 > Java > 正文

Java中如何用Gson解析和生成JSON数据

冰火之心
发布: 2025-06-28 23:14:01
原创
1010人浏览过

gson是google提供的用于java对象与json数据转换的库。1.使用时需先通过maven或gradle引入依赖;2.通过tojson()方法实现java对象到json字符串的序列化;3.通过fromjson()方法实现json字符串到java对象的反序列化;4.支持处理包含集合的复杂对象,反序列化泛型集合时需使用typetoken;5.提供自定义序列化和反序列化机制,如处理日期格式、忽略特定字段等;6.与其他json库相比,gson简单易用适合快速开发,但性能不如jackson或fastjson;7.gson实例线程安全,但gsonbuilder配置不应并发修改;8.循环引用问题可通过避免序列化相关字段或自定义序列化器解决。

Java中如何用Gson解析和生成JSON数据

Gson是Google提供的一个强大的Java库,用于在Java对象和JSON数据之间进行转换。简单来说,它能帮你把Java对象变成JSON字符串,也能把JSON字符串还原成Java对象,省去了手动解析和构建JSON的麻烦。

Java中如何用Gson解析和生成JSON数据

解决方案

Java中如何用Gson解析和生成JSON数据

要使用Gson,首先需要在你的项目中引入Gson库。如果你使用Maven,可以在pom.xml文件中添加以下依赖:

立即学习Java免费学习笔记(深入)”;

Java中如何用Gson解析和生成JSON数据
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version> <!-- 使用最新版本 -->
</dependency>
登录后复制

如果你使用Gradle,可以在build.gradle文件中添加以下依赖:

dependencies {
    implementation 'com.google.code.gson:gson:2.8.9' // 使用最新版本
}
登录后复制

1. 将Java对象转换为JSON字符串(序列化)

假设我们有一个简单的Java类:

public class Person {
    private String name;
    private int age;
    private String email;

    public Person(String name, int age, String email) {
        this.name = name;
        this.age = age;
        this.email = email;
    }

    // Getters and setters (省略)
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
登录后复制

要将Person对象转换为JSON字符串,可以使用Gson的toJson()方法:

import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        Person person = new Person("Alice", 30, "alice@example.com");
        Gson gson = new Gson();
        String json = gson.toJson(person);
        System.out.println(json); // 输出: {"name":"Alice","age":30,"email":"alice@example.com"}
    }
}
登录后复制

2. 将JSON字符串转换为Java对象(反序列化)

要将JSON字符串转换为Person对象,可以使用Gson的fromJson()方法:

import com.google.gson.Gson;

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"Bob\",\"age\":25,\"email\":\"bob@example.com\"}";
        Gson gson = new Gson();
        Person person = gson.fromJson(json, Person.class);
        System.out.println(person.getName()); // 输出: Bob
        System.out.println(person.getAge());  // 输出: 25
        System.out.println(person.getEmail()); // 输出: bob@example.com
    }
}
登录后复制

3. 处理复杂对象和集合

Gson不仅可以处理简单的Java对象,还可以处理包含集合(如List、Map)的复杂对象。

例如,假设我们有一个包含Person对象列表的类:

import java.util.List;

public class Company {
    private String name;
    private List<Person> employees;

    public Company(String name, List<Person> employees) {
        this.name = name;
        this.employees = employees;
    }

    // Getters and setters (省略)
    public String getName() {
        return name;
    }

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

    public List<Person> getEmployees() {
        return employees;
    }

    public void setEmployees(List<Person> employees) {
        this.employees = employees;
    }
}
登录后复制

序列化:

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

public class Main {
    public static void main(String[] args) {
        List<Person> employees = new ArrayList<>();
        employees.add(new Person("Alice", 30, "alice@example.com"));
        employees.add(new Person("Bob", 25, "bob@example.com"));

        Company company = new Company("Example Corp", employees);
        Gson gson = new Gson();
        String json = gson.toJson(company);
        System.out.println(json);
        // 输出: {"name":"Example Corp","employees":[{"name":"Alice","age":30,"email":"alice@example.com"},{"name":"Bob","age":25,"email":"bob@example.com"}]}
    }
}
登录后复制

反序列化:

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

public class Main {
    public static void main(String[] args) {
        String json = "{\"name\":\"Example Corp\",\"employees\":[{\"name\":\"Alice\",\"age\":30,\"email\":\"alice@example.com\"},{\"name\":\"Bob\",\"age\":25,\"email\":\"bob@example.com\"}]}";
        Gson gson = new Gson();

        // 使用TypeToken来指定List<Person>的类型
        Type companyType = new TypeToken<Company>() {}.getType();
        Company company = gson.fromJson(json, companyType);

        System.out.println(company.getName()); // 输出: Example Corp
        List<Person> employees = company.getEmployees();
        for (Person employee : employees) {
            System.out.println(employee.getName());
        }
        // 输出:
        // Alice
        // Bob
    }
}
登录后复制

注意:在反序列化包含泛型的集合时,需要使用TypeToken来指定集合的类型。

Find JSON Path Online
Find JSON Path Online

Easily find JSON paths within JSON objects using our intuitive Json Path Finder

Find JSON Path Online 30
查看详情 Find JSON Path Online

Gson的高级用法:自定义序列化和反序列化

有时候,默认的序列化和反序列化方式可能不满足需求。例如,你可能需要格式化日期,或者忽略某些字段。Gson提供了自定义序列化器和反序列化器的机制来实现这些需求。

如何处理JSON中的日期格式?

Gson默认使用ISO 8601日期格式。如果你的JSON日期格式不同,你需要自定义JsonSerializerJsonDeserializer

import com.google.gson.*;
import java.lang.reflect.Type;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConverter implements JsonSerializer<Date>, JsonDeserializer<Date> {

    private final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

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

    @Override
    public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        try {
            return dateFormat.parse(json.getAsString());
        } catch (ParseException e) {
            throw new JsonParseException(e);
        }
    }
}
登录后复制

然后,在使用Gson时注册这个自定义的转换器:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Date.class, new DateConverter())
    .create();
登录后复制

如何忽略JSON中的某些字段?

可以使用@Expose注解结合GsonBuilder来控制哪些字段需要序列化和反序列化。

首先,在需要序列化和反序列化的字段上添加@Expose注解:

import com.google.gson.annotations.Expose;

public class User {
    @Expose
    private String username;

    private String password; // 不希望序列化或反序列化

    @Expose(serialize = false, deserialize = true) // 只反序列化
    private String email;

    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    // Getters and setters (省略)
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
登录后复制

然后,使用GsonBuilderexcludeFieldsWithoutExposeAnnotation()方法来创建一个Gson实例:

Gson gson = new GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .create();
登录后复制

Gson与其他JSON库的比较,我该选择哪个?

除了Gson,还有Jackson、Fastjson等流行的JSON库。Gson的优点是简单易用,API友好,适合初学者。Jackson的性能更好,功能更强大,但配置也更复杂。Fastjson的性能也很好,但安全性方面存在一些问题。选择哪个库取决于你的具体需求和偏好。如果项目对性能要求不高,且需要快速开发,Gson是一个不错的选择。如果对性能有较高要求,且愿意花时间学习配置,可以考虑Jackson。

Gson的线程安全性如何?

Gson实例是线程安全的,可以被多个线程共享。但是,如果你在多个线程中同时修改GsonBuilder的配置,可能会导致线程安全问题。因此,建议在创建Gson实例后,不要再修改GsonBuilder的配置。

在使用Gson时遇到循环引用的问题怎么办?

循环引用是指对象之间相互引用,导致序列化时无限循环。Gson默认会抛出StackOverflowError异常。为了解决这个问题,可以使用@Expose注解结合GsonBuilder来避免序列化循环引用的字段,或者自定义序列化器来处理循环引用。另一种方法是使用@JsonIdentityInfo注解(需要引入Jackson库),它可以为每个对象生成一个唯一的ID,从而避免循环引用。

以上就是Java中如何用Gson解析和生成JSON数据的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号