学习笔记
Gson 解析数据的逻辑是基于 JSON 数据和 Java 对象之间的映射。Gson 库能够将 JSON 数据转换为 Java 对象,或者将 Java 对象转换为 JSON 字符串。它使用反射机制,自动将 JSON 字符串的字段映射到 Java 对象的属性,反之亦然。
1. 基本概念
-
JSON (JavaScript Object Notation):一种轻量级的数据交换格式,常用于客户端和服务器之间传输数据。通常以键值对的形式组织数据。
-
Java 对象:Java 程序中的数据结构或实体类(通常是 POJO — Plain Old Java Object)。Java 对象有属性和方法。
Gson 库可以实现 JSON 和 Java 对象之间的转换。常见的操作有:
-
从 JSON 字符串解析到 Java 对象。
-
将 Java 对象序列化成 JSON 字符串。
2. Gson 解析数据的流程
1. 准备 POJO 类
首先,我们需要创建一个与 JSON 数据结构相匹配的 Java 类(POJO 类)。Gson 会根据这个类的字段来解析 JSON 数据。
假设你的 JSON 数据如下:
{
"reason": "success",
"result": {
"curpage": 1,
"allnum": 3,
"newslist": [
{
"id": "ea5caaa3dc77b80916f4e1d00367b52a",
"ctime": "2024-11-22 10:11",
"title": "Example News",
"description": "",
"source": "News Source",
"picUrl": "",
"url": "https://example.com"
}
]
},
"error_code": 0
}
你需要创建一个 Java 类来与这个 JSON 数据结构匹配:
public class XinWenPhoto {
private String reason;
private Result result;
private int errorCode;
// Getter 方法
public String getReason() {
return reason;
}
public Result getResult() {
return result;
}
public int getErrorCode() {
return errorCode;
}
public static class Result {
private int curpage;
private int allnum;
private List<NewsItem> newslist;
// Getter 方法
public int getCurpage() {
return curpage;
}
public int getAllnum() {
return allnum;
}
public List<NewsItem> getNewslist() {
return newslist;
}
}
public static class NewsItem {
private String id;
private String ctime;
private String title;
private String description;
private String source;
private String picUrl;
private String url;
// Getter 方法
public String getId() {
return id;
}
public String getCtime() {
return ctime;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
public String getSource() {
return source;
}
public String getPicUrl() {
return picUrl;
}
public String getUrl() {
return url;
}
}
}
2. 使用 Gson 解析 JSON 数据
然后,使用 Gson
库来解析这个 JSON 字符串。解析的核心逻辑就是将 JSON 字符串转换成你定义的 Java 对象。
import com.google.gson.Gson;
public class Main {
public static void main(String[] args) {
// 示例 JSON 数据
String json = "{\n" +
" \"reason\": \"success\",\n" +
" \"result\": {\n" +
" \"curpage\": 1,\n" +
" \"allnum\": 3,\n" +
" \"newslist\": [\n" +
" {\n" +
" \"id\": \"ea5caaa3dc77b80916f4e1d00367b52a\",\n" +
" \"ctime\": \"2024-11-22 10:11\",\n" +
" \"title\": \"Example News\",\n" +
" \"description\": \"\",\n" +
" \"source\": \"News Source\",\n" +
" \"picUrl\": \"\",\n" +
" \"url\": \"https://example.com\"\n" +
" }\n" +
" ]\n" +
" },\n" +
" \"error_code\": 0\n" +
"}";
// 创建 Gson 对象
Gson gson = new Gson();
// 使用 Gson 解析 JSON 字符串到 Java 对象
XinWenPhoto apiResponse = gson.fromJson(json, XinWenPhoto.class);
// 打印解析后的数据
System.out.println("Reason: " + apiResponse.getReason());
System.out.println("Error Code: " + apiResponse.getErrorCode());
// 获取并打印新闻列表
for (XinWenPhoto.NewsItem news : apiResponse.getResult().getNewslist()) {
System.out.println("News ID: " + news.getId());
System.out.println("Title: " + news.getTitle());
System.out.println("Time: " + news.getCtime());
System.out.println("Source: " + news.getSource());
System.out.println("URL: " + news.getUrl());
System.out.println("---------------");
}
}
}
3. Gson 解析的核心原理
Gson 通过以下方式实现了 JSON 数据与 Java 对象之间的映射:
-
字段匹配:Gson 根据 Java 类中定义的字段名,将其与 JSON 数据中的键(key)一一对应。字段名和键名要一致,大小写也需要匹配,除非你通过
@SerializedName
注解进行修改。 -
数据类型转换:Gson 会根据字段的类型(例如,
int
、String
、List
等)来自动将 JSON 数据中的值转换为 Java 对应类型。如果 JSON 中的类型和 Java 字段的类型不匹配,Gson 会抛出异常(如JsonSyntaxException
)。 -
反射机制:Gson 使用 Java 的反射机制来分析 Java 类的字段,并将相应的 JSON 数据填充到这些字段中。
4. 常用注解
Gson 提供了一些注解,允许我们定制 JSON 与 Java 对象之间的映射规则:
-
@SerializedName("json_field_name")
: 用于指定 JSON 字段名与 Java 字段名不一致时的映射规则。例如:
public class User { @SerializedName("user_id") private String id; private String name; // Getters and setters }
-
@Expose
: 用于指定哪些字段在序列化和反序列化时需要被包括或排除。
5. Gson 的序列化与反序列化
-
反序列化:将 JSON 字符串转换为 Java 对象。
// 将 JSON 字符串解析为 Java 对象 MyClass myObject = gson.fromJson(jsonString, MyClass.class);
-
序列化:将 Java 对象转换为 JSON 字符串。
// 将 Java 对象转换为 JSON 字符串 String jsonString = gson.toJson(myObject);
6. 总结
Gson 解析 JSON 数据的核心逻辑就是通过反射机制将 JSON 字符串中的字段映射到 Java 类的字段,解析过程中根据 Java 类中字段的类型自动转换 JSON 数据的值。你可以通过注解定制映射规则,从而灵活地处理 JSON 和 Java 对象之间的转换。
-
从 JSON 到 Java:通过
fromJson()
方法,Gson 会自动将 JSON 字符串转换为 Java 对象。 -
从 Java 到 JSON:通过
toJson()
方法,Gson 会将 Java 对象转换为 JSON 字符串。
如果你有更深入的问题或进一步的需求,随时告诉我!