Android 原生解析 Json 字符串
Android 原生解析 JSON 字符串
- 1. JSON 基础
- 2. Android 原生 JSON 解析方法
- 2.1 解析 JSON 字符串到 JSONObject
- 关键方法
- 2.2 解析 JSON 数组到 JSONArray
- 关键方法
- 2.3 解析嵌套的 JSON 对象
- 3. 处理异常
- 4. 总结
在 Android 开发中,我们经常需要从服务器获取 JSON 格式的数据,并将其解析为我们可以操作的对象。尽管 Android 有很多第三方库可以帮助我们解析 JSON(如 Gson、Moshi、Fastjson 等),但了解如何使用 Android 原生工具来解析 JSON 数据对于深入理解 JSON 处理机制是非常有帮助的。
1. JSON 基础
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON 格式的数据通常以键值对的形式出现,支持嵌套结构和数组。
例如,以下是一个简单的 JSON 字符串:
{"name": "John","age": 30,"email": "john@example.com","address": {"street": "123 Main St","city": "Anytown"},"phoneNumbers": ["123-456-7890","987-654-3210"]
}
2. Android 原生 JSON 解析方法
在 Android 中,org.json 是一个内置的库,它提供了一些类来解析和构建 JSON 数据。这些类包括:
JSONObject:用于解析和操作 JSON 对象。JSONArray:用于解析和操作 JSON 数组。
2.1 解析 JSON 字符串到 JSONObject
JSONObject 是 Android 中用于解析 JSON 对象的核心类。如果 JSON 数据是一个对象,我们首先使用 JSONObject 类来解析。
import org.json.JSONException;
import org.json.JSONObject;public class JsonParser {public static void main(String[] args) {// JSON 字符串String jsonString = "{\"name\":\"John\", \"age\":30, \"email\":\"john@example.com\"}";try {// 创建 JSONObject 实例JSONObject jsonObject = new JSONObject(jsonString);// 通过 get 方法获取对应的字段String name = jsonObject.getString("name");int age = jsonObject.getInt("age");String email = jsonObject.getString("email");// 输出解析结果System.out.println("Name: " + name);System.out.println("Age: " + age);System.out.println("Email: " + email);} catch (JSONException e) {e.printStackTrace();}}
}
关键方法
getString(String key):获取字符串类型的值。getInt(String key):获取整数类型的值。getDouble(String key):获取浮动类型的值。getBoolean(String key):获取布尔类型的值。
如果键不存在或类型不匹配,会抛出 JSONException。
2.2 解析 JSON 数组到 JSONArray
如果 JSON 数据包含数组,我们可以使用 JSONArray 类来解析。
import org.json.JSONArray;
import org.json.JSONException;public class JsonArrayParser {public static void main(String[] args) {// JSON 数组字符串String jsonArrayString = "[\"123-456-7890\", \"987-654-3210\"]";try {// 创建 JSONArray 实例JSONArray jsonArray = new JSONArray(jsonArrayString);// 遍历数组并获取每个元素for (int i = 0; i < jsonArray.length(); i++) {String phoneNumber = jsonArray.getString(i);System.out.println("Phone Number: " + phoneNumber);}} catch (JSONException e) {e.printStackTrace();}}
}
关键方法
getString(int index):根据索引获取字符串类型的值。getInt(int index):根据索引获取整数类型的值。length():返回数组的长度。
2.3 解析嵌套的 JSON 对象
如果 JSON 字符串包含嵌套的对象或数组,我们可以递归解析这些数据。
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;public class NestedJsonParser {public static void main(String[] args) {// 嵌套 JSON 字符串String nestedJsonString = "{" +"\"name\": \"John\"," +"\"address\": {" +"\"street\": \"123 Main St\"," +"\"city\": \"Anytown\"" +"}," +"\"phoneNumbers\": [" +"\"123-456-7890\"," +"\"987-654-3210\"" +"]" +"}";try {// 创建 JSONObject 实例JSONObject jsonObject = new JSONObject(nestedJsonString);// 获取顶层字段String name = jsonObject.getString("name");JSONObject address = jsonObject.getJSONObject("address");JSONArray phoneNumbers = jsonObject.getJSONArray("phoneNumbers");// 解析嵌套的 address 对象String street = address.getString("street");String city = address.getString("city");// 输出结果System.out.println("Name: " + name);System.out.println("Street: " + street);System.out.println("City: " + city);// 解析 phoneNumbers 数组for (int i = 0; i < phoneNumbers.length(); i++) {String phoneNumber = phoneNumbers.getString(i);System.out.println("Phone Number: " + phoneNumber);}} catch (JSONException e) {e.printStackTrace();}}
}
在上面的例子中,我们先解析了 JSON 对象中的顶层数据,然后通过 getJSONObject 方法进一步获取嵌套的 JSON 对象,并通过 getJSONArray 方法获取 JSON 数组。
3. 处理异常
在 JSON 解析过程中,常见的异常包括:
- JSONException:通常是由于 JSON 格式不正确或者类型不匹配引起的。
- NullPointerException:当某个键对应的值为
null时,访问该值可能会引发NullPointerException。
为了提高代码的健壮性,我们可以使用 opt 系列方法来代替 get 系列方法,这样可以避免因为缺少键值或类型不匹配导致的异常。
例如:
optString(String key, String defaultValue):返回字符串类型的值,如果键不存在或值为null,返回默认值。optInt(String key, int defaultValue):返回整数类型的值,如果键不存在或值为null,返回默认值。
4. 总结
在 Android 开发中,虽然有许多第三方库可以简化 JSON 解析的过程,但了解如何使用原生的 org.json 库进行 JSON 解析是非常有益的。JSONObject 和 JSONArray 提供了强大的方法来帮助我们处理 JSON 数据,尤其是在需要解析嵌套结构时,能够高效地提取和操作数据。
- 使用
JSONObject和JSONArray解析 JSON 数据。 - 处理嵌套的 JSON 对象和数组。
- 使用
opt系列方法避免常见的异常。
相关文章:
Android 原生解析 Json 字符串
Android 原生解析 JSON 字符串 1. JSON 基础2. Android 原生 JSON 解析方法2.1 解析 JSON 字符串到 JSONObject关键方法 2.2 解析 JSON 数组到 JSONArray关键方法 2.3 解析嵌套的 JSON 对象 3. 处理异常4. 总结 在 Android 开发中,我们经常需要从服务器获取 JSON 格…...
Windsurf可以上传图片开发UI了
背景 曾经羡慕Cursor的“画图”开发功能,这不Windsurf安排上了。 Upload Images to Cascade Cascade now supports uploading images on premium models Ask Cascade to build or tweak UI from on image upload New keybindings Keybindings to navigate betwe…...
Qt UI设计 菜单栏无法输入名字
在UI界面“在这里输入”,直接双击填写名称,无论是中文还是英文都没有反应。解决方案 2个: 1.双击“在这里输入之后”,在可编辑状态下,空格→enter键,然后在右下角属性框的title中直接填写中文或英文名&…...
blender 视频背景
准备视频文件 首先,确保你有想要用作背景的视频文件。视频格式最好是 Blender 能够很好兼容的,如 MP4 等常见格式。 创建一个新的 Blender 场景或打开现有场景 打开 Blender 软件后,你可以新建一个场景(通过点击 “文件” - “新建…...
【python】OpenCV—Tracking(10.5)—dlib
文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数dlib.correlation_tracker() 6、参考 1、功能描述 基于 dlib 库,实现指定类别的目标检测和单目标跟踪 2、代码实现 caffe 模型 https://github.com/MediosZ/MobileNet-SSD/tree/master/…...
音视频入门基础:MPEG2-TS专题(9)——FFmpeg源码中,解码TS Header的实现
一、引言 FFmpeg源码对MPEG2-TS传输流/TS文件解复用时,在通过read_packet函数读取出一个transport packet后,会调用handle_packet函数来处理该transport packet: static int handle_packets(MpegTSContext *ts, int64_t nb_packets) { //..…...
解决“磁盘已插上,但Windows系统无法识别“问题
电脑上有2块硬盘,一块是500GB的固态硬盘,另一块是1000GB的机械硬盘,按下开机键,发现500G的固态硬盘识别了,但1000GB的机械硬盘却无法识别。后面为了描述方便,将"500GB的固态硬盘"称为X盘…...
论文笔记-WWW2024-ClickPrompt
论文笔记-WWW2024-ClickPrompt: CTR Models are Strong Prompt Generators for Adapting Language Models to CTR Prediction ClickPrompt: CTR模型是大模型适配CTR预测任务的强大提示生成器摘要1.引言2.预备知识2.1传统CTR预测2.2基于PLM的CTR预测 3.方法3.1概述3.2模态转换3.…...
53 基于单片机的8路抢答器加记分
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 首先有三个按键 分别为开始 暂停 复位,然后八个选手按键,开机显示四条杠,然后按一号选手按键,数码管显示30,这…...
【java数据结构】二叉树OJ题
【java数据结构】二叉树OJ题 一、检查两颗树是否相同二、另一颗树的子树三、翻转二叉树四、对称二叉树五、判断一颗二叉树是否是平衡二叉树六、给定一个二叉树, 找到该树中两个指定节点的最近公共祖先七、根据一棵树的前序遍历与中序遍历构造二叉树练习:八、二叉树前…...
IIC和SPI的时序图
SCL的变化快慢决定了通信速率,当SCL为低电平的时候,无论SDA是1还是0都不识别: ACK应答:当从设备为低电平的时候识别为从设备有应答: 谁接收,谁应答: 起始位和停止位: IIC的时序图&am…...
MySQL数据库表的操作
1、总述 今天我跟大家分享MySQL数据库中表的创建,查看,修改,删除。 2、创建表 create table table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明࿱…...
.net core 创建linux服务,并实现服务的自我更新
目录 创建服务创建另一个服务,用于执行更新操作给你的用户配置一些systemctl命令权限 创建服务 /etc/systemd/system下新建服务配置文件:yourapp.service,内容如下: [Unit] Descriptionyourapp Afternetwork.target[Service] Ty…...
springboot338it职业生涯规划系统--论文pf(论文+源码)_kaic
毕 业 设 计(论 文) 题目:it职业生涯规划系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以…...
oracle将select作为字段查询
在Oracle中,如果你想将一个SELECT语句作为字段的值,你可以使用子查询或者使用WITH子句(也称为公用表表达式CTE)。以下是两种方法的示例: 方法1:使用子查询 语法如下: SELECTcolumn1,(SELECT …...
Java数据结构和算法相关面试题
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
网络安全风险评估
项目背景 随着信息化技术的快速发展,特别是面向社会、政府机构、企业等业务系统的投入使用,各组织机构对网络和信息系统安全防护都提出了新的要求。为满足安全需求,需对组织机构的网络和信息系统的安全进行一次系统全面的评估,以…...
ADAM优化算法与学习率调度器:深度学习中的关键工具
深度学习模型的训练效果离不开优化算法和学习率的选择。ADAM(Adaptive Moment Estimation)作为深度学习领域中广泛应用的优化算法之一,以其高效性和鲁棒性成为许多任务的默认选择。而学习率调度器则是优化算法的“助推器”,帮助训…...
岛屿数量C++11新特性
每日一题 200. 岛屿数量 class Solution {//使用深度的优先搜索来搜索岛屿图//遍历整个图片 当char数组的值为1时开始从这个点开始往外扩散搜索//注意处理边界 图不是正方形 public:int ans;int d[4][2] {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};int N;int M;void dfs(vector<…...
Git 快速入门:全面了解与安装步骤
Git 快速入门:全面了解与安装步骤 一、关于Git 1.1 简介 Git 是一个开源的分布式版本控制系统,由 Linus Torvalds 于 2005 年创建,最初是为了更好地管理 Linux 内核开发而设计。 Git用于跟踪计算机文件的变化,特别是源代码文件…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
