51. 【Android教程】JSON 数据解析

在上一节我们学习了 xml 数据格式,如果你觉得 xml 的数据比较冗余,标签、属性等等定义过于复杂,那么这一节我们将继续学习另一种更精简、更高效的数据格式—— Json。它广泛的运用于数据持久化以及网络传输中,这一节我们一起学习 Json 的特点及其具体用法。

1. Json 的优势

1.1 与 xml 的对比

在实际开发中,数据传输和存储我们通常更推荐使用 Json 数据格式,相比 xml 它有以下几个有点:

  • Json 更高效,解析库的使用也更方便
  • 不像 XML,Json 省去了很多冗余,整体而言更简洁
  • 只有对象和数组两种,内部元素比较少,便于理解

1.2 Json 的元素类型

Json 内部只有对象和数组两种类型,如下是一个 Json 对象的数据样例

上面简短的 Json 数据对应一个“工程师”对象,里面包含技术、开发语言和工龄。再来看一个工程师对象数组:

{
"Engineers": [{"skill": "Android","language": "Java","years": "5"},{"skill": "iOS","language": "Object C","years": "2"},{"skill": "Server","language": "php","years": "8"}]
}

以上 Json 数据就是一个包含 3 个“工程师”的对象数组。

2. Json 库的使用

Android 内部为我们提供了 Json 的解析接口,以下是接口中常用的类:

  • JSONObject:(必考)
    对应一个 Json 对象,相当于上面例子中的“工程师”
  • JSONArray:(必考)
    对应一个 Json 对象数组,相当于上面例子中的“工程师”数组
  • JSONStringer:
    Json 文本辅助工具,可以帮助我们快速创建一个 Json String
  • JSONTokener:
    Json 特殊字符解析类
  • JSONException:**
    Json 异常

其中前两个打上“必考”标识的是重中之重,关于 Json 处理的 90% 问题都需要这两个类的帮忙,后面我们会看到这两个接口的具体用法。

3. Json 解析示例

本节我们来用 Android 原生的 Json 工具对 1.2 小节中的“工程师”数据进行一个解析,主需要用到必考的两个类:JSONArrayJSONObject

3.1 布局文件

布局文件非常简单,主要功能就是做一个解析事件的触发和解析结果的展示即可,如下:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:id="@+id/json"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_marginStart="30dp"android:layout_marginTop="46dp"android:text="Json文本" /><Buttonandroid:id="@+id/parse"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/json"android:layout_centerHorizontal="true"android:layout_marginTop="30dp"android:text="开始解析" />
</RelativeLayout>

3.2 解析逻辑

在实际开发中,解析逻辑通常可以单独提出一个类似 Utils 的工具类,这样可以提供给各方使用。本节放在 MainActivity 中完成,获取 Button 后在onClick()方法中调用parse()方法进行 Json 数据解析。最后将解析结果放到 TextView 上展示:


package com.emercy.myapplication;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;import org.json.JSONArray;
import org.json.JSONObject;public class MainActivity extends Activity {public static final String JSON_STRING = "{\"Engineers\":[{\"skill\":\"Android\",\"language\":\"Java\",\"years\":\"5\"},{\"skill\":\"iOS\",\"language\":\"Object C\",\"years\":\"2\"},{\"skill\":\"Server\",\"language\":\"php\",\"years\":\"8\"}]}";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.parse).setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {parse(JSON_STRING);}});}private void parse(String jsonStr) {TextView textView = (TextView) findViewById(R.id.json);try {JSONObject engineers = new JSONObject(jsonStr);JSONArray array = engineers.getJSONArray("Engineers");StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < array.length(); i++) {JSONObject engineer = array.getJSONObject(i);String skill = engineer.getString("skill");String language = engineer.getString("language");int years = engineer.getInt("years");stringBuilder.append("Engineer ").append(i).append(": skill is ").append(skill).append("; language is ").append(language).append("; years is ").append(years).append("\n");}textView.setText(stringBuilder.toString());} catch (Exception e) {e.printStackTrace();}}
}

核心解析逻辑都在parse()方法中,拿到 Json String 之后,首先从中去除“工程师”数组,然后遍历数组一次解析“skill”、“language”、“years”字段,挨个生成好“工程师”对象,然后拼接成结果文本展示到 TextView 上。编译后点击解析,结果如下:

4. 小结

本节学习了另一种数据格式,Json 相比 xml 更加精简,而且可以看到 API 的使用也更加直观方便,所以在网络数据的传输和存储方面会更胜一筹。Andorid 提供了一套 Json 数据的解析工具,里面最核心的两个类就是JSONArrayJSONObject,这两个是一定要掌握的。最后通过一个例子解析了一个对象,里面包含一个“工程师”数组,然后通过遍历数据即可得到各个“工程师”对象了。当然,除了 Android 内置的 Json 工具之外,还有很多第三方的解析工具,功能非常强大,但只要理解了 Json 数据格式的使用,各大框架也只是一个轮子的使用而已,大同小异。

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

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

相关文章

CTF(Capture The Flag)编码方式

CTF&#xff08;Capture The Flag&#xff09;比赛中&#xff0c;编码和解码是常见的挑战类别之一&#xff0c;涉及到各种不同的编码方式。以下是一些CTF中可能出现的编码技术列表&#xff1a; Base系列编码&#xff1a; Base16&#xff08;Hexadecimal&#xff09;&#xff1a…

Hi3519AV100 处理器⾼速全局快⻔相机

⾼速全局快⻔相机采⽤ 1英⼨全局快⻔ Sensor&#xff0c;⽀持 H.264/H.265 编码&#xff0c;8 百万 分辨率模式下最⾼帧率可达 50 帧/秒&#xff0c;1080P 模式下最⾼帧率可达 120 帧/秒。主控采⽤ Hi3519AV100 处理器&#xff0c;集成 2 Tops AI 算⼒ NPU &#xff0c;⽀持⼤…

SGP.32-12

有任何关于GSMA\IOT\eSIM\RSP\业务应用场景相关的问题&#xff0c;欢迎W: xiangcunge59 一起讨论, 共同进步 (加的时候请注明: 来自CSDN-iot). 3.9 SM-DS Use 3.9.2.2 Event Retrieval by the eIM 在文档中提到的“通过eIM检索事件”的过程涉及了IoT设备中的IPA&#…

浮子式水位计施工细则

1浮子式水位计应安装在水位测井内&#xff0c;安装示意图见下图。 2设备安装要求 以测井中心为基准参考点&#xff0c;将水位计底板放在工作平台上。将悬索与平衡锤固定或锁紧&#xff0c;慢慢将平衡锤放至井底。 3&#xff09;悬索另一端绕于水位轮&#xff0c;留长1m&#…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后&#xff0c;会用yolo v9 来测试一下&#xff0c;看8g 显存能不能跑下来&#xff0c;上次用无影云电脑&#xff0c;4cpu8g内存直接爆了&#xff0c;云电脑也死机了&#xff0c;提示一直占用内存不释放&#xff0c;我自己的云电脑不能占用内…

AI机器视觉平台赋能:实现智慧工厂质检产品缺陷精准识别

背景 随着人工智能浪潮的涌起&#xff0c;智能技术与制造业的交融日益紧密&#xff0c;智能化成为现代制造业不可或缺的核心竞争力。传统制造业与智能制造业在生产效率、产品质量等方面的巨大差异&#xff0c;正促使传统制造业积极拥抱智能化变革&#xff0c;以缩小发展鸿沟。 …

2024年五一杯高校数学建模竞赛(A题)|钢板切割问题 | 建模解析,小鹿学长带队指引全代码文章与思路

我是鹿鹿学长&#xff0c;就读于上海交通大学&#xff0c;截至目前已经帮200人完成了建模与思路的构建的处理了&#xff5e; 本篇文章是鹿鹿学长经过深度思考&#xff0c;独辟蹊径&#xff0c;通过路径优化解决钢板切割问题。结合贪心算法&#xff0c;Floyd-Warshall等多元算法…

JDBC连接流程

jdbc流程 1.加载MySQL驱动 Class.forName(“com.mysql.jdbc.Driver”); 2.获取MySQL连接 Connetion con DriverManager.getConnetion(url,root,password); 3.设置参数&#xff0c;预注入SQL语句 PrepareStatement prep con.prepareStatement(“select * from dual”); 4.…

WPS文字页面横向

要将WPS文字页面设置为横向&#xff0c;可以按照以下步骤操作&#xff1a;12 打开WPS文字文档&#xff0c;点击“页面布局”选项卡。在“页面布局”中找到“纸张方向”选项。选择“横向”&#xff0c;这样整篇文档的页面方向就会变为横向。 如果只需要将文档中的特定页面设置…

vue3实现移动端,PC端响应式布局

纯移动端|PC端 这种适用于只适用一个端的情况 方法&#xff1a;amfe-flexible postcss-pxtorem相结合 ① 执行以下两个命令 npm i -S amfe-flexible npm install postcss-pxtorem --save-dev② main.js文件引用 import amfe-flexible③ 根目录新建一个postcss.config.js文件…

VS2022 .Net6.0 无法打开窗体设计器

拿Vs2022 建了个Demo&#xff0c;运行环境是net6.0-windows&#xff0c;无论双击或是右键都打不开窗体设计器 打开项目目录下的*.csproj.user <?xml version"1.0" encoding"utf-8"?> <Project ToolsVersion"Current" xmlns"htt…

CHM 创建工具

确实有一些可替代HTML Help Workshop的工具&#xff0c;它们同样能帮助你创建、编辑和编译CHM文件&#xff0c;以下是一些备选方案&#xff1a; HelpNDoc: 这是一款强大的帮助文件创作软件&#xff0c;支持包括CHM在内的多种输出格式。它拥有直观的界面&#xff0c;适合初学者和…

vue-treeselect 实现懒加载 + 远程模糊搜索 支持多选,可悬浮提示选择项所有层级 已封装为组件

今天实现一个客户单位组织树的功能&#xff0c;不限层级&#xff0c;数据量巨大&#xff0c;采用vue-treeselect 实现懒加载 远程搜索 这是vue iview组件 element的需要改一下tooltip的写法 这个支持对选择的单位全部层级进行悬浮提示&#xff08;也无法在下面下拉回显&am…

PUBG下载

https://www.pubgmobile.com/HK/events.shtml?page1&#xff08;手机版&#xff09; https://steam2.ssyxjs.cn/gameStore/detail12/2204?plan%E7%BB%9D%E5%9C%B0%E6%B1%82%E7%94%9F-18&e_creative88906878234&e_keywordid784021409904&bd_vid843425054508232313…

【Qt之·控件·样式表】

系列文章目录 文章目录 前言一、Qt样式表的基础知识1.1 Qt样式表的定义和语法规则1.2 Qt样式表中的选择器和属性1.2.1 盒子模型1.2.2 border 1.3 Qt样式表中的伪类和伪元素 二、编写基本的Qt样式表2.1 在Qt应用程序中引入样式表文件的方式2.2 设置基本的背景色、字体样式等 三、…

MacOs安装pyenv环境

pyenv介绍 Pyenv 是一个流行的 Python 版本管理工具&#xff0c;它允许你在同一台机器上安装和切换不同版本的 Python。Pyenv 的主要作用包括&#xff1a; 多版本管理: 允许你在同一台计算机上安装多个版本的 Python&#xff0c;包括官方版本、开发版本和各种发行版。这对于测试…

知识图谱与知识表示:人工智能的基石

知识图谱与知识表示&#xff1a;人工智能的基石 一、知识图谱&#xff1a;连接数据的桥梁1.1 知识图谱的构成1.2 知识图谱的应用 二、知识表示&#xff1a;AI的推理基础2.1 知识表示的定义2.2 知识表示的形式 三、从符号表示到向量表示3.1 符号表示与向量表示3.2 向量表示的优势…

搭建企业级DNS服务器真实案例精讲

搭建企业级DNS服务器真实案例精讲 1----3-2-1.1.搭建DNS服务服务器为公司的多个域名提供解析.M 2----3-2-1.2格建DNS服务服务器为公司的客不域名提供解析补 3----3-2-1.3.格建DNS服务服务器为公司的多个域名提供解析扣 4----3-2-1.4.搭建DNS服务服务器为公司的多个域名提供解析…

JAVA: Spring Boot加载 Shiro 配置 >>找不到 SecurityManager

在 Spring Boot 应用中集成和配置 Apache Shiro 通常涉及创建一个配置类来设置 SecurityManager&#xff0c;以及定义 Shiro 的 Web 支持和必要的安全策略。下面是使用 Spring Boot 配置 Apache Shiro 的步骤&#xff1a; ### 1. 添加依赖 首先&#xff0c;确保在你的 pom.xml…

跟我学C++中级篇——零长度数组

一、零长度数组 最初使用零长度数组是在串口通信和网络通信中使用的&#xff0c;它类似于下面的代码&#xff1a; struct Data {int a;char c;char buf[0]; };零长度数组又叫柔性数组&#xff0c;这个非常贴切。它早期是GNU的一个扩展&#xff0c;后来在C99中也进行了支持&am…