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用于跟踪计算机文件的变化,特别是源代码文件…...
基于域自适应的双光融合
目录 引言DAF-Net编码器-解码器分支编码器部分融合层解码器部分 域自适应层概述多核最大均值差异(MK-MMD)第一阶段:编码器-解码器分支训练训练过程损失函数 第二阶段:融合层训练训练过程损失函数 实验与结果总结 文章声明…...
迭代器模式 (Iterator Pattern)
文章目录 迭代器模式 (Iterator Pattern)原理优点缺点示例代码场景描述1. 定义迭代器接口2. 定义集合接口3. 实现具体集合类4. 客户端代码输出结果 UML 类图使用场景优化与扩展小结 迭代器模式 (Iterator Pattern) 迭代器模式是一种 行为型设计模式,用于顺序访问集…...
039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)
(来左边儿 跟我一起画个龙,在你右边儿 画一道彩虹 ~~~~~~~~~~~ ) 效果如下: namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public static DateTime startTime;[CommandM…...
如何将 GitHub 私有仓库(private)转换为公共仓库(public)
文章目录 如何将 GitHub 私有仓库转换为公共仓库步骤 1: 登录 GitHub步骤 2: 导航到目标仓库步骤 3: 访问仓库设置步骤 4: 更改仓库可见性步骤 5: 确认更改步骤 6: 验证更改注意事项 如何将 GitHub 私有仓库转换为公共仓库 在软件开发领域,GitHub 是一个广受欢迎的…...
C++11 右值引用
目录 左值 右值 左值引用与右值引用比较 左值引用总结: 右值引用总结: 左值引用的使用场景: 引用传参和做返回值都可以提高效率(减少拷贝) 左值引用的短板: 右值引用和移动语义解决上述问题: 下面就是有移动…...
WPS表格学习计划与策略
一、学习目标 掌握WPS表格的基本操作:包括新建、打开、保存工作簿,单元格的编辑与格式化,数据的输入与验证等。熟练运用WPS表格的数据处理功能:包括数据排序、筛选、分类汇总,以及使用公式和函数进行计算和分析。学会制作图表与数据可视化:掌握不同类型图表(如柱状图、折…...
Android 引入 proto 项目及使用方法
Proto(Protocol Buffers)是Google开发的一种语言无关、平台无关的序列化结构数据的方法,它类似于JSON和XML,但相对于XML而言更小,相对于JSON而言解析更快,支持多语言。以下是将Proto引入Android项目的方法及…...
VSOMEIP主要流程的时序
请求服务: client应用: application_impl::request_service routing_manager_client::request_service (老版本是routing_manager_proxy) routing_manager_client::send_request_services protocol::request_service_command its_command; // 创建…...
右值引用和移动语义:
C 右值引用和移动语义详解 在 C 的发展历程中,右值引用和移动语义的引入带来了显著的性能提升和编程灵活性。本文将深入探讨右值引用和移动语义的概念、用法以及重要性。 一、引言 C 作为一门高效的编程语言,一直在不断演进以满足现代软件编程的需求。…...
经纬高LLA转地心地固ECEF坐标,公式,代码
经纬高转地心地固的目的 坐标系转换是gis或者slam系统常见操作。GNSS获取的一般是经纬高,经纬高在slam系统里无法应用,slam系统一般是xyz互相垂直的笛卡尔坐标系,所以需要把GNSS的经纬高转到直角坐标系地心地固ECEF或者高斯投影GKP。 划重点…...
大连疫情防控政策/seo建站的步骤
QToolTip 是一个 Qt 库中的一个小部件,它可以在鼠标悬停在窗口部件上时显示一条提示信息。你可以使用它来向用户提供有用的信息或者提示,比如按钮的功能、输入字段的格式要求等。QToolTip 支持富文本,所以你可以在提示信息中使用文字样式、图…...
帮人管理网站做淘宝客/建站网站
########1 (python 虚拟环境(如pycharm 中的 project )是一个独立的环境,所以也要重新安装一次第三方包) 上官网搜索 包 https://pypi.org/project/paramiko/#files 0, 查看已经安装的第三方包 python--->在交互式解释器中输入>>>…...
做外包的网站/行业数据统计网站
问题:单片机的外围电路设计及程序编写大多是以低电平有效来驱动电路的? 回答:这是因为单片机的低电平时的灌电流一般比高电平时的拉电流要大。如一般的51 系列单片机的I/O 口可以输出4mA 的拉电流或20mA 的灌电流;而其他也有一些芯…...
wordpress 导航栏在哪里/百度seo关键词排名技术
物联网简介 物联网是新一代信息技术的重要组成部分,也是“信息化”时代的重要发展阶段。顾名思义,物联网就是物物相连的互联网。这有两层意思: 其一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩…...
wordpress 间距/网站创建流程
基于分布式模式安装HBase,首先它是在安装在HDFS集群之上,所以,首先要做的就是能够正确配置分布式模式的HDFS集群:保证Nanemode和Datanode进程都正确启动。HBase是一个分布式NoSQL数据库,建立于HDFS之上,并且…...
网站建设业务活动/win10优化软件
临近年关了,2012的脚步越来越近了,公司的事情越来越多,回家的压力也渐渐加大了,一方面是车票原因,另一方面……不说也罢!年底公司都会有各种各样的福利发放,我无厘头的冒出一个想法,…...