Android 浅谈Gson解析逻辑(初学者学习笔记)

server/2024/11/23 11:58:47/

学习笔记

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 数据如下:

java">{"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 数据结构匹配:

java">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 对象。

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 会根据字段的类型(例如,intStringList 等)来自动将 JSON 数据中的值转换为 Java 对应类型。如果 JSON 中的类型和 Java 字段的类型不匹配,Gson 会抛出异常(如 JsonSyntaxException)。

  • 反射机制:Gson 使用 Java 的反射机制来分析 Java 类的字段,并将相应的 JSON 数据填充到这些字段中。

4. 常用注解

Gson 提供了一些注解,允许我们定制 JSON 与 Java 对象之间的映射规则:

  • @SerializedName("json_field_name"): 用于指定 JSON 字段名与 Java 字段名不一致时的映射规则。

    例如:

    java">public class User {@SerializedName("user_id")private String id;private String name;// Getters and setters
    }
    
  • @Expose: 用于指定哪些字段在序列化和反序列化时需要被包括或排除。

5. Gson 的序列化与反序列化

  • 反序列化:将 JSON 字符串转换为 Java 对象。

    java">// 将 JSON 字符串解析为 Java 对象
    MyClass myObject = gson.fromJson(jsonString, MyClass.class);
    
  • 序列化:将 Java 对象转换为 JSON 字符串。

    java">// 将 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 字符串。

如果你有更深入的问题或进一步的需求,随时告诉我!


http://www.ppmy.cn/server/144251.html

相关文章

Leetcode打卡:统计不是特殊数字的数字数量

执行结果&#xff1a;通过 题目&#xff1a;3233 统计不是特殊数字的数字数量 给你两个 正整数 l 和 r。对于任何数字 x&#xff0c;x 的所有正因数&#xff08;除了 x 本身&#xff09;被称为 x 的 真因数。 如果一个数字恰好仅有两个 真因数&#xff0c;则称该数字为 特殊数…

Admin.NET框架前端由于keep-alive设置缓存导致的onUnmount未触发问题

bug版本&#xff1a;next分支&#xff0c;基于.NET6版本&#xff1b; 问题描述&#xff1a; 1、添加keep-alive后&#xff0c;在其下运行的组件会出现onActived(被关注时)和onDeactived(取消关注时)生命周期&#xff0c;而组件原有生命周期为onMounted(被创造时)和onUnmounted(…

VSCode 间距太小

setting->font family 使用&#xff1a;Consolas, Courier New, monospace 字体

HTML·第八章 利用CSS制作导航栏菜单

8.1 水平顶部导航栏 水平顶部导航栏&#xff08;Horizontal Top Navigation Bar&#xff09;是网页设计中常用的一种导航栏布局&#xff0c;通常位于页面的顶部&#xff0c;以水平的方式排列导航选项。这种布局便于用户快速访问网站的主要部分。常见的设计元素包括菜单项、图标…

110. UE5 GAS RPG 实现玩家角色数据存档

在这篇&#xff0c;我们实现将玩家数据保存到存档内。 增加保存玩家属性 玩家属性默认的等级&#xff0c;经验值&#xff0c;可分配的技能点和属性点。还有一些角色基础属性也需要保存&#xff0c;回忆一下&#xff0c;我们是如何实现玩家的属性的&#xff0c;我们是通过多个…

金融量化框架选择

文章目录 1. **QuantConnect**2. **Zipline**3. **Backtrader**4. **QuantLib**5. **Alpaca**6. **PyAlgoTrade**7. **PyQuantLib**8. **QSTrader**如何选择开源量化交易框架&#xff1f;总结 在金融领域&#xff0c;很多开源量化交易框架和工具被广泛使用&#xff0c;允许研究…

Python学习29天

二分查找 # 定义函数冒泡排序法从大到小排列 def bbble_sort(list):# i控制排序次数for i in range(len(list) - 1):# j控制每次排序比较次数for j in range(len(list) - 1 - i):if list[j] < list[j 1]:list[j], list[j 1] list[j 1], list[j] # 定义二分查找函数 def…

鸿蒙动画开发08——帧动画

1、概 述 帧动画通过应用onFrame逐帧回调的方式&#xff0c;让开发者在应用侧的每一帧都可以设置属性值&#xff0c;从而实现设置了该属性值对应组件的动画效果。 相比于属性动画&#xff0c;开发者可感知动画的过程&#xff0c;实时修改UI侧的值&#xff0c;具有事件可实时响…