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,一经查实,立即删除!

相关文章

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

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

浮子式水位计施工细则

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等多元算法…

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…

【Qt之·控件·样式表】

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

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

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

C# 实现格式化文本导入到Excel

目录 需求 Excel 的文本文件导入功能 范例运行环境 配置Office DCOM 实现 组件库引入 OpenTextToExcelFile 代码 调用 小结 需求 在一些导入功能里&#xff0c;甲方经常会给我们一些格式化的文本&#xff0c;类似 CSV 那样的纯文本。比如有关质量监督的标准文件&…

TCP/IP和HTTP协议

TCP/IP OSI 七层模型在提出时的出发点是基于标准化的考虑&#xff0c;而没有考虑到具体的市场需求&#xff0c;使得该模型结构复杂&#xff0c;部分功能冗余&#xff0c;因而完全实现 OSI 参考模型的系统不多。而 TCP/IP 参考模型直接面向市场需求&#xff0c;实现起来也比较…

一文掌握:Clipboard API ,让前端顺畅操作剪贴板,无论怎么复制,都显示你网站信息。

一、Clipboard API是什么 Clipboard API 是一个 Web API&#xff0c;它提供了一种在网页上读取和写入剪贴板内容的方式。通过 Clipboard API&#xff0c;网页可以访问用户的剪贴板&#xff0c;从中读取文本、图像或其他数据&#xff0c;并且可以将数据写入剪贴板&#xff0c;以…

计算机毕业设计python_django宠物领养系统z6rfy

本宠物领养系统主要包括两大功能模块&#xff0c;即管理员模块、用户模块。下面将对这两个大功能进行具体功能需求分析。 &#xff08;1&#xff09;管理员&#xff1a;管理员登录后主要功能包括个人中心、用户管理、送养宠物管理、地区类型管理、失信黑名单管理、申请领养管理…

封装umi-request时通过 AbortController 配置取消请求

一、关键部分 一、在封装的request.ts中 声明一个 abortControllers 对象用于存储要取消的请求&#xff08;我用了-s表示复数&#xff0c;多个abortcontroller对象&#xff0c;与下面&#x1f447;的单个abortController区分&#xff09;封装取消请求的函数cancelRequest, 传入…

038——基于STM32和I.MX6uLL实现uart控制GPS(失败者总结)

目录 1、GPS模块简介 2、GPS数据格式 3、方案梳理 1、GPS模块简介 全球定位系统(Global Positioning System&#xff0c; GPS)是一种以空中卫星为基础的高精度无线电导航的定位系统&#xff0c;它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间…

邦注科技 温控箱对企业的重要性

注塑加工是将加热的熔融塑料注入模具中形成所需产品的工艺过程。良好的注塑加工工艺需要控制好许多参数&#xff0c;其中最重要的因素之一就是模具的温度。模具温度的不稳定会导致产品尺寸大小、表面缺陷等方面的问题&#xff0c;甚至会导致生产不良品&#xff0c;加大生产成本…

【webrtc】MessageHandler 5: 基于线程的消息处理:以PeerConnection信令线程为例

peerconn的信令是通过post 消息到自己的信令线程消息来处理的PeerConnectionMessageHandler 是具体的处理器G:\CDN\rtcCli\m98\src\pc\peer_connection_message_handler.hMachinery for handling messages posted to oneself PeerConnectionMessageHandler 明确服务于 signalin…

数据仓库和数据仓库分层

一、数据仓库概念 数据仓库(Data Warehouse)&#xff0c;可简写为DW或DWH。数据仓库&#xff0c;是为企业所有级别的决策制定过程&#xff0c;提供所有类型数据支持的战略集合。它是单个数据存储&#xff0c;出于分析性报告和决策支持目的而创建。 为需要业务智能的企业&#…

CGAL 点云数据生成DSM、DTM、等高线和数据分类

原文链接 CGAL 点云数据生成DSM、DTM、等高线和数据分类 - 知乎 在GIS应用软件中使用的许多传感器(如激光雷达)都会产生密集的点云。这类应用软件通常利用更高级的数据结构&#xff1a;如&#xff1a;不规则三角格网 (TIN)是生成数字高程模型 (DEM) 的基础&#xff0c;也可以利…

2024深圳杯数学建模竞赛A题(东三省数学建模竞赛A题):建立火箭残骸音爆多源定位模型

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓&#xff08;浏览器打开&#xff09; https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 2024深圳杯数学建模竞赛A题&#xff08;东三省数学建模竞赛A题&#xff0…