Gson入门教程:让JSON处理变得简单到爆!

JSON解析教程(Gson、FastJson、Jackson) 既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。 阅读详情

JSON数据处理在现代Java开发中简直是家常便饭。无论你是在写Web API、移动端接口,还是处理配置文件,JSON都会频繁出现在你的代码里。而Gson,这个Google开源的JSON库,绝对是处理JSON数据的最佳选择之一!

什么是Gson?为什么它这么受欢迎

Gson(Google JSON)是Google开发的一个开源Java库,专门用来在Java对象和JSON数据之间进行转换。说白了,就是帮你把复杂的Java对象轻松转成JSON字符串,或者把JSON字符串还原成Java对象。

你可能会问:市面上这么多JSON库,为啥偏偏选Gson?

原因很简单:

  • 零配置:大多数情况下,你啥都不用配置就能直接用
  • 性能优秀:转换速度快,内存占用合理
  • 社区活跃:Google出品,文档齐全,社区支持给力
  • 功能强大:支持复杂的数据结构,包括泛型、继承等

快速上手:第一个Gson程序

首先得把Gson加到你的项目里。如果用Maven,在pom.xml里加上这几行:

<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'

然后我们来写第一个例子。假设你有个简单的用户类:

public class User {
    private String name;
    private int age;
    private String email;
    
    // 构造函数、getter、setter省略...
}

Java对象转JSON(序列化):

Gson gson = new Gson();
User user = new User("张三", 25, "zhangsan@example.com");
String json = gson.toJson(user);
System.out.println(json);
// 输出:{"name":"张三","age":25,"email":"zhangsan@example.com"}

JSON转Java对象(反序列化):

String json = "{\"name\":\"李四\",\"age\":30,\"email\":\"lisi@example.com\"}";
User user = gson.fromJson(json, User.class);
System.out.println(user.getName()); // 输出:李四

就这么简单!是不是感觉比想象中容易很多?

深入理解:处理复杂数据结构

集合类型的处理

实际开发中,你经常需要处理列表、数组这样的集合类型。Gson处理起来也很轻松:

// List转JSON
List<User> userList = Arrays.asList(
    new User("张三", 25, "zhangsan@example.com"),
    new User("李四", 30, "lisi@example.com")
);
String json = gson.toJson(userList);

但是JSON转List就稍微复杂一点(这里有个小坑要注意!):

// 错误的方式(会报错)
List<User> users = gson.fromJson(json, List<User>.class); // 编译错误!

// 正确的方式
Type listType = new TypeToken<List<User>>(){}.getType();
List<User> users = gson.fromJson(json, listType);

为什么会这样?因为Java的泛型擦除机制。运行时JVM无法知道List里装的是什么类型,所以需要用TypeToken来明确指定。

嵌套对象的处理

现实中的数据结构往往比较复杂,对象里包含对象是常有的事。比如一个部门类包含多个员工:

public class Department {
    private String name;
    private List<User> employees;
    // 构造函数、getter、setter省略...
}

Gson处理嵌套对象简直是小菜一碟:

Department dept = new Department("技术部", userList);
String json = gson.toJson(dept);
// Gson会自动递归处理所有嵌套对象

Department parsedDept = gson.fromJson(json, Department.class);

高级技巧:让Gson更强大

自定义字段名称

有时候JSON字段名和Java属性名不一致。比如API返回的是snake_case,但Java习惯用camelCase:

public class ApiResponse {
    @SerializedName("user_name")
    private String userName;
    
    @SerializedName("created_at")
    private String createdAt;
}

排除某些字段

有些敏感字段(比如密码)不想序列化到JSON里:

public class User {
    private String name;
    
    @Expose(serialize = false)
    private String password; // 这个字段不会出现在JSON中
    
    private transient String tempData; // transient字段也会被忽略
}

记得在创建Gson时启用Expose注解:

Gson gson = new GsonBuilder()
    .excludeFieldsWithoutExposeAnnotation()
    .create();

自定义日期格式

默认情况下,Gson对Date类型的处理可能不符合你的预期:

Gson gson = new GsonBuilder()
    .setDateFormat("yyyy-MM-dd HH:mm:ss")
    .create();

美化JSON输出

调试时想让JSON更容易阅读?用这个:

Gson gson = new GsonBuilder()
    .setPrettyPrinting()
    .create();

实战案例:构建一个完整的配置文件读取器

让我们用Gson做个实际的小项目。假设你要为应用程序创建一个配置文件读取器:

public class AppConfig {
    @SerializedName("app_name")
    private String appName;
    
    @SerializedName("database")
    private DatabaseConfig database;
    
    @SerializedName("redis")
    private RedisConfig redis;
    
    // getter/setter省略...
}

public class DatabaseConfig {
    private String host;
    private int port;
    private String username;
    private String password;
    // getter/setter省略...
}

public class RedisConfig {
    private String host;
    private int port;
    private int timeout;
    // getter/setter省略...
}

配置文件(config.json):

{
  "app_name": "我的应用",
  "database": {
    "host": "localhost",
    "port": 3306,
    "username": "root",
    "password": "123456"
  },
  "redis": {
    "host": "localhost",
    "port": 6379,
    "timeout": 5000
  }
}

读取配置的工具类:

public class ConfigReader {
    private static final Gson gson = new GsonBuilder()
        .setPrettyPrinting()
        .create();
    
    public static AppConfig loadConfig(String filePath) {
        try {
            String json = Files.readString(Paths.get(filePath));
            return gson.fromJson(json, AppConfig.class);
        } catch (Exception e) {
            throw new RuntimeException("配置文件读取失败!", e);
        }
    }
    
    public static void saveConfig(AppConfig config, String filePath) {
        try {
            String json = gson.toJson(config);
            Files.writeString(Paths.get(filePath), json);
        } catch (Exception e) {
            throw new RuntimeException("配置文件保存失败!", e);
        }
    }
}

使用起来超级简单:

// 读取配置
AppConfig config = ConfigReader.loadConfig("config.json");
System.out.println("应用名称:" + config.getAppName());

// 修改配置
config.getDatabase().setPassword("newPassword");

// 保存配置
ConfigReader.saveConfig(config, "config.json");

性能优化小贴士

虽然Gson已经很快了,但在高并发场景下还是有一些优化技巧:

复用Gson实例

Gson对象是线程安全的,而且创建成本相对较高。最好创建一个全局实例复用:

public class JsonUtils {
    private static final Gson GSON = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd HH:mm:ss")
        .create();
    
    public static String toJson(Object obj) {
        return GSON.toJson(obj);
    }
    
    public static <T> T fromJson(String json, Class<T> clazz) {
        return GSON.fromJson(json, clazz);
    }
}

使用流式API处理大文件

如果要处理特别大的JSON文件,可以考虑使用Gson的流式API:

// 读取大型JSON数组
JsonReader reader = new JsonReader(new FileReader("large-file.json"));
reader.beginArray();
while (reader.hasNext()) {
    User user = gson.fromJson(reader, User.class);
    // 处理单个用户对象
}
reader.endArray();
reader.close();

常见问题和解决方案

问题1:空指针异常

如果JSON中某个字段为null,而你的Java类中对应字段是基本类型,就会出问题:

// 危险的写法
private int age; // 如果JSON中age为null,会抛异常

// 安全的写法
private Integer age; // 使用包装类型

问题2:字段名不匹配

JSON字段名和Java属性名不一致时,记得用@SerializedName注解:

@SerializedName("user_id")
private String userId;

问题3:循环引用

如果对象之间存在循环引用(A引用B,B又引用A),Gson会抛出StackOverflowError。解决方法是用@Expose注解排除某些字段,或者重新设计数据结构。

总结

Gson作为一个成熟的JSON处理库,真的是Java开发者的好伙伴。它的简洁API让JSON处理变得轻松愉快,强大的功能又能应对各种复杂场景。

掌握了这些基础知识和高级技巧,你就可以在项目中自信地使用Gson了。记住几个关键点:

  • 简单场景直接用toJson()和fromJson()
  • 复杂泛型用TypeToken
  • 合理使用注解控制序列化行为
  • 复用Gson实例提升性能

最后想说,学习新技术最好的方法就是动手实践。赶紧在你的项目里试试Gson吧,相信你会爱上它的便捷和强大!

Java servlet使用GSON返回JSON 1. 首先引入GSON类库到Webapp工程 复制到WebContent/WEB 阅读详情

相关推荐

Google的GSON处理JSON解析

Google的GSON处理JSON解析 GSON是Google开发的Java API,用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。 更多关于GSON的API可以访问:http://sites.google.com/site/gson/. 一、下载与安装 在使用GSON API工作之前,你需要下载库(jar文件),并将其包含到类路径中。 库,连同源

pplsunny----舞动青春 1802

Java 中 Gson的使用

JSON 是一种文本形式的数据交换格式,它比XML更轻量、比二进制容易阅读和编写,调式也更加方便;解析和生成的方式很多,Java中最常用的类库有:JSON-Java、Gson、Jackson、FastJson等 一、Gson的基本用法 Gson提供了fromJson() 和toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化;同时每个方法都提供了重载方法 1)基本数据...

hengdeveloper 1389

JSON教程之GSON基本解析(Gson-Java)

https://code.google.com/p/google-gson/downloads/list https://sites.google.com/site/gson/gson-user-guide http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html

楚门的世界 4191

Gson详解(一)

Gson(又称Google Gson)是Google公司发布的一个开放源代码的Java库,主要用途为序列化Java对象为JSON字符串,或反序列化JSON字符串成Java对象。而JSON(JavaScriptObject Notation) 是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成,广泛应用于各种数据的交互中,尤其是服务器与客户端的交互。引入依赖:</</</</二.Gson使用2.1Gson的创建Gson的创建方式一:直接new Gson对象。

lw的博客 4005

Jenkins Gson API插件:统一JSON处理的基础库

Jenkins的Gson API插件是一个为其他Jenkins插件提供Google Gson库(v2.13.2)运行时支持的基础库插件。它本身不提供用户界面或直接功能,主要作用是统一管理Gson依赖,避免多个插件打包不同版本的Gson而导致冲突。Gson API插件是Jenkins生态系统中一个重要的“基础设施”。虽然用户不直接与之交互,但它为众多插件的JSON处理功能提供了稳定基石,保证了整个系统的整洁和健壮。

weixin_30777913的博客 1039

掌握JsonObject:使用Gson库处理JSON数据

本文还有配套的精品资源,点击获取 简介:JSON是一种轻量级的数据交换格式,广泛用于Java中的数据交换。 JsonObject 是Google开发的Gson库中用于Java对象与JSON字符串相互转换的类。本文介绍 JsonObject 的基本结构和使用,展示如何在Java项目中添加Gson库依赖,以及如何通过Gson库实现数据的序列化和反序列...

weixin_42263617的博客 2441

Gson

https://blog.youkuaiyun.com/kakaxi1o1/article/details/79643399 Gson介绍:GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。特点: a...

s297485987的专栏 511

【故障排查】telnet连接失败:端口23不可达的深度分析与解决方案

本文深度解析telnet连接失败时端口23不可达的常见原因与解决方案。从快速自查目标地址、端口到服务端排查,涵盖服务状态检查、防火墙配置及安全组设置,并提供进阶诊断工具与抓包分析方法。文章强调telnet协议的安全风险,建议在生产环境中改用SSH等加密协议进行远程管理。

weixin_28323057的博客 394

Gson的详细使用

gson解析json的详细使用

qq_32035241的博客 4862

无法联网的情况下,dbeaver离线安装数据库驱动-clickhouse

无法联网的情况下,dbeaver离线安装数据库驱动-clickhouse

u012831187的博客 1万+

【数据分析与挖掘实战】金融风控之贷款违约预测详解1(有代码和数据集)

金融风控一.题目理解1.1.题目概况1.2数据概况1.3预测指标二.数据来源三.查看数据四.分类指标计算示例4.1混淆矩阵4.2准确度4.3precision(精确度),recall(召回率),f1-score4.4P-R曲线4.5ROC曲线4.6AUC曲线4.7KS值五.数据分析5.1基本信息5.2查看数据集中特征缺失值,唯一值等5.3查看特征的数值类型有哪些,对象类型有哪些5.3.1数值连续型变量分析5.3.2非数值类别型变量分析5.3.3总结:5.4变量分布可视化5.4.1单一变量分布可视化 更新中~

m0_49263811的博客 1万+

使用GSON解析JSON数据

GSON是谷歌提供的一个开源库,可以用来解析JSON数据 不过GSON并没有被添加到Android官方的API中,所以如果要使用这个开源库,我们就要先添加依赖,编辑app/build.gradle文件,在dependencies闭包中添加如下内容: implementation 'com.squareup.okhttp3:okhttp:4.0.1' implementation 'co...

冰之沁泠的博客 1万+

Zabbix监控联想服务器XCC的SNMPv3配置实战

本文详细介绍了如何通过SNMPv3协议配置Zabbix监控联想服务器XCC的实战方法。文章从安全角度阐述了选择SNMPv3的必要性,并分步讲解了在XCC中启用SNMPv3、创建认证用户,以及在Zabbix中导入专用模板、创建主机并关联模板的完整流程,帮助运维人员实现对服务器硬件健康状态的自动化、安全监控。

weixin_29210727的博客 464

SpringBoot中使用Gson处理JSON

一、GSON简介 GSON是Google公司提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。 Gson特点如下: 快速、高效 代码量少、简洁 面向对象 数据传递和解析方便 Gson依赖如下: <dependency> <groupId>com.g...

Mango的博客 6914

word2vector入门教程

摘要: 网上已经有许多对w2v的介绍了,这里只是做一个简单的概括。下面这篇文章我认为是关于W2V写的比较好的文章,读者有兴趣可以先参考一下: w2v参考文章1 另外一篇是关于Skip-Gram和CBow的介绍。 Skip-Gram&CBOW 逻辑比较清晰的综述文章: 综述文章 数学原理很清晰很短的一篇文章(也有关于负采样的简单说明) 参考文章 1.什么

SCUT_Sam 1万+

YOLOP v2!YOLOv7结合YOLOP的多任务版本 更好、更快、更强

YOLOP v2!YOLOv7结合YOLOP的多任务版本 更好、更快、更强

jacke121的专栏 2705

Retrofit + GSON处理JSON模板

动机 首先封装了Retrofit的一些操作,也就是回调的时候不必去为每个javabean的每个操作去写一个Callback,所有的bean公用一个Callback。 使用了MVP的设计思想,加上公用的Callback,使得每个bean的Presenter层只需要极少的方法,就可以实现原来的功能。 然后封装GSON,定义了公用的Holder容器,存储从服务器直接返回的JSON数据,然后分发给每个bea

HaveFerrair的博客 6583

cefsharp139-H264-X86升级测试(MP4)-支持PDF预览-chromium7258定制浏览器

CEFSharp 139.x版本升级测试已完成,该版本支持64位系统(需选择x86架构)及WinForms.NETCore(.NET8)。升级内容包括H264文件编译支持Mp4播放,并覆盖WPF、WinForms等平台。文中提供了版本替换方法及不同系统的版本建议(如Win10/11推荐111/133/134/139版)。此外,文章还列举了CEFSharp的多种应用场景,包括浏览器开发、B/S系统封装、资源抓取等,同时指出当前版本均需自行编译以支持MP4播放。详细图文说明及旧版链接已附在正文中。

无线智能模块 可视DIY智能专家 1295

Java——使用GSON对JSON进行解析 教程

GSON GSON是Googel公司开发的用于解析json的类库。可以很轻松地让程序员将java对象转换成JSON格式,或者将JSON格式的对象转换成Java对象。 使用方法很简单: 首先,需要将GSON类库的jar包引入到自己的IDE中,本教程使用IDEA为例子。 1.下载GSON的jar包 GSON的github地址:https://github.com/google/gson/ GSON的下载地址:https://search.maven.org/artifact/com.google.c

连长少尉 6649

CMOS Sensor的调试经验分享

我这里要介绍的就是CMOS摄像头的一些调试经验。 首先,要认识CMOS摄像头的结构。我们通常拿到的是集成封装好的模组,一般由三个部分组成:镜头、感应器和图像信号处理器构成。一般情况下,集成好的模组我们只看到外面的镜头、接口和封装壳,这种一般是固定焦距的。有些厂商只提供芯片,需要自己安装镜头,镜头要选择合适大小的镜头,如果没有夜视要求的话,最好选择带有红外滤光的镜头,因为一般的sensor都...

camerall 3763

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android中使用GSON包解析JSON数据(简单JSON)

之前一直使用Java自带的JSONObject,JSONArray来进行解析,在JSON嵌套不多,数据不大的时候还是不错的。但是对于大量的JSON数据来说,效率就比较低了。Gson是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。使用了面向对象的思想,提高了JSON解析的效率。        需要解析的JSON数据如下(JSON数据我保存为"languages.js

乞力马扎罗的雪CYF的博客 4140

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Gson在使用时怎么对JSON容错处理

序 “JSON是一种具有自描述的、独立于语言的、轻量级文本数据交换格式,经常被用于数据的存储和传输。而GSON可以帮我们快速的将JSON数据,在对象之间序列化和反序列化。” GSON 的toJson()和fromJson()这两个方法,是GSON最基本的使用方式,它很直观,也没什么好说的。但当被问及GSON如何对JSON数据容错,如何灵活序列化和反序列化的时候,就有点抓瞎了。 JSON数据容错,最简单的方式是让前后端数据保持一致,就根本不存在容错的问题,但是现实场景中,...

Dream It Possible 2574

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Jackson、Gson、fastjson:JSON处理哪家强?

有时我们需要对某些字段进行特殊处理:@Override// 注册使用return obj;.create();@Override// 注册使用Jackson:功能最全面,性能优秀,适合复杂场景(大厂推荐)Gson:API最简单,适合快速开发和小型项目fastjson:性能最强,但安全风险需要考虑。

yezi1238的博客 1176

Eclipse安装GSON,使用GSON转换Java Object到JSON

标题在eclipse里安装GSON创建一个对象并转换成JSON 在eclipse里安装GSON 从这里选择合适的GSON版本,下载GSON的jar文件:https://repo1.maven.org/maven2/com/google/code/gson/gson/ 保存jar文件到本地目录 选中project点击鼠标右键,选择"Build Path" -> “Configure Build Path” 选择"Java Build Path", 打开"Libraries",把jar文

weixin_42325834的博客 2039

序列化方式二——JSON之Gson

JsonSerializer和JsonDeserializer:Gson 1.x版本中提供的自定义序列化器和反序列化器接口,基于树型结构进行解析。TypeAdapter:Gson 2.0版本中新增的自定义序列化器和反序列化器接口,基于流式结构进行解析,相比树型结构更节省内存。通过实现JsonSerializer和JsonDeserializer接口来自定义序列化和反序列化过程。这在你需要处理复杂对象或特殊格式时非常有用。Builder;Data;Date;

zhouhengzhe的博客 2797

Gson详解:Java JSON处理的利器

Gson是Google开发的Java JSON处理库,提供简单高效的序列化与反序列化功能。核心优势包括:简洁API(toJson/fromJson方法)、嵌套对象处理能力、自定义字段映射(@SerializedName注解)、字段排除选项(transient/@Expose)。通过GsonBuilder可实现高级配置(格式化、日期处理等),自定义TypeAdapter支持特殊类型转换。性能优化建议复用Gson实例,大数据使用流式处理。相比其他库,Gson以易用性、稳定性和灵活性著称,适合各类JSON处理场景

2501_93471649的博客 921
上一篇: 这个GitHub项目简直是开发者的藏宝图!免费公共API资源库public-apis深度体验
下一篇: 这个两万Star的Agent技能仓库,帮你省了三个月开发时间
普通网友
博客等级 码龄2年 153粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值