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

news2024/11/23 23:06:08

学习笔记

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 会根据字段的类型(例如,intStringList 等)来自动将 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 字符串。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2246296.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pycharm在使用conda虚拟环境时Terminal爆红问题

问题&#xff1a; 解决方法&#xff1a; 复制cmd.exe后面所有路径 添加到pycharm的shell path中&#xff1a;

嵌入式LVGL自定义纯数字键盘

嵌入式LVGL自定义纯数字键盘 一、前言二、设置自定义数字键盘三、使用一、前言 嵌入式UI项目中有时候会使用到纯数字密码的需求,所以打算使用LVGL构建自定义的纯数字键盘。 二、设置自定义数字键盘 参考这个文章,以LV_KEYBOARD_MODE_USER_1为例,增加一个数字键盘,如下图所…

太速科技-512-基于ZU19EG的4路100G 8路40G的光纤汇流计算卡

基于ZU19EG的4路100G 8路40G的光纤汇流计算卡 一、板卡概述 本板卡系我司自主设计研发&#xff0c;基于Xilinx公司Zynq UltraScale MPSOC系列SOC XCZU19EG-FFVC1760架构&#xff0c;ARM端搭载一组64-bit DDR4&#xff0c;总容量达4GB&#xff0c;可稳定运行在2400MT/s…

【java-Neo4j 5开发入门篇】-最新Java开发Neo4j

系列文章目录 前言 上一篇文章讲解了Neo4j的基本使用&#xff0c;本篇文章对Java操作Neo4j进行入门级别的阐述&#xff0c;方便读者快速上手对Neo4j的开发。 一、开发环境与代码 1.docker 部署Neo4j #这里使用docker部署Neo4j,需要镜像加速的需要自行配置 docker run --name…

时间请求参数、响应

&#xff08;7&#xff09;时间请求参数 1.默认格式转换 控制器 RequestMapping("/commonDate") ResponseBody public String commonDate(Date date){System.out.println("默认格式时间参数 date > "date);return "{module : commonDate}"; }…

华为防火墙技术基本概念学习笔记

1.防火墙概述 1.1防火墙与交换机、路由器对比 路由器与交换机的本质是转发&#xff0c;防火墙的本质是控制。 防火墙与路由器、交换机是有区别的。路由器用来连接不同的网络&#xff0c;通过路由协议保证互联互通&#xff0c;确保将报文转发到目的地;交换机则通常用来组建局域…

基于深度学习CNN算法的花卉分类识别系统01--带数据集-pyqt5UI界面-全套源码

文章目录 基于深度学习算法的花卉分类识别系统一、项目摘要二、项目运行效果三、项目文件介绍四、项目环境配置1、项目环境库2、环境配置视频教程 五、项目系统架构六、项目构建流程1、数据集2、算法网络Mobilenet3、网络模型训练4、训练好的模型预测5、UI界面设计-pyqt56、项目…

Java的方法、基本和引用数据类型

个人的黑马程序员java笔记 目录 方法 例&#xff1a;方法定义和调用 方法的重载 对于byte, short, int, long类型 方法的内存 基本数据类型 引用数据类型 方法的值的传递的内存原理 方法 方法&#xff08;method&#xff09;是程序中最小的执行单元格式 方法定义&a…

分层架构 IM 系统之架构演进

在电商业务日活几百万的情况下&#xff0c;IM 系统采用分层架构方式&#xff0c;如下图。 分层架构的 IM 系统&#xff0c;整体上包含了【终端层】、【入口层】、【业务逻辑层】、【路由层】、【数据访问层】和【存储层】&#xff0c;我们在上篇文章&#xff08;分层架构 IM 系…

【Docker】Docker介绍|部署|简单使用|镜像操作|容器操作|自动构建镜像

文章目录 DockerDocker介绍Docker简介Docker的主要特点为什么要使用Docker&#xff1f;Docker核心概念&#xff08;1&#xff09;镜像&#xff08;Image&#xff09;&#xff08;2&#xff09;容器&#xff08;Container&#xff09;&#xff08;3&#xff09;仓库&#xff08;…

LLM( Large Language Models)典型应用介绍 1 -ChatGPT Large language models

ChatGPT 是基于大型语言模型&#xff08;LLM&#xff09;的人工智能应用。 GPT 全称是Generative Pre-trained Transformer。-- 生成式预训练变换模型&#xff1a; Generative&#xff08;生成式&#xff09;&#xff1a;可以根据输入生成新的文本内容&#xff0c;例如回答问题…

PAL(Program-Aided Language Model)

PAL&#xff08;Program-Aided Language Model&#xff09;是一种结合生成式语言模型&#xff08;如 GPT&#xff09;和程序执行能力的技术框架。它的核心思想是通过让语言模型生成代码或程序来解决复杂任务&#xff0c;程序执行的结果反过来增强语言模型的输出准确性和逻辑性。…

Flutter:AnimatedSwitcher当子元素改变时,触发动画

AnimatedSwitcher中的子元素 由:CircularProgressIndicator() 改变为:Image.network(https://cdn.uviewui.com/uview/swiper/1.jpg) 则会触发动画class _MyHomePageState extends State<MyHomePage> {bool flag true;overrideWidget build(BuildContext context) {retur…

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中&#xff0c;中间件&#xff08;Middleware&#xff09;是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑&#xff0c;像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用&#xff0c;也可以只在特定页…

QT中QString类的各种使用

大部分的QString使用可以参考:QT中QString 类的使用--获取指定字符位置、截取子字符串等_qstring 取子串-CSDN博客 补充一种QString类的分离:Qt QString切割(Split()与Mid()函数详解)_qstring split-CSDN博客 1. Trimmed和Simplified函数(去除空白) trimmed&#xff1a;去除了…

经济增长初步

1.人均产出 人均产出&#xff0c;通常指的是一个国家、地区或组织在一定时期内&#xff0c;每个劳动人口平均创造的生产总值。它是衡量一个地区或国家经济效率和劳动生产率的重要指标。具体来说&#xff0c;人均产出可以通过以下公式计算&#xff1a; 人均产出总产出/劳动人口…

c#使用高版本8.0步骤

一、找到项目所在怒路&#xff0c;记事本打开.proj文件。 二、记事本打开此文件&#xff0c;<PropertyGroup>后面加入如下语句&#xff1a; <LangVersion>8.0</LangVersion> 关闭并保存。 根据提示全部重新加载即可。

Flutter:SlideTransition位移动画,Interval动画延迟

配置vsync&#xff0c;需要实现一下with SingleTickerProviderStateMixinclass _MyHomePageState extends State<MyHomePage> with SingleTickerProviderStateMixin{// 定义 AnimationControllerlate AnimationController _controller;overridevoid initState() {super.…

深入浅出分布式缓存:原理与应用

文章目录 概述缓存分片算法1. Hash算法2. 一致性Hash算法3. 应用场景Redis集群方案1. Redis 集群方案原理2. Redis 集群方案的优势3. Java 代码示例:Redis 集群数据定位Redis 集群中的节点通信机制:Gossip 协议Redis 集群的节点通信:Gossip 协议Redis 集群的节点通信流程Red…

SQL注入--联合注入--理论

什么是SQL注入&#xff1f; SQL注入&#xff08;SQL Injection&#xff09;是一种常见的Web安全漏洞。 形成的主要原因是web应用程序在接收相关数据参数时未做好过滤&#xff0c;将其直接带入到数据库中查询&#xff0c;导致攻击者可以拼接执行构造的SQL语句&#xff0c;从而获…