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

news2025/1/15 20:54:43

在上一节我们学习了 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">

    <TextView
        android: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文本" />

    <Button
        android: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\"}]}";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.parse).setOnClickListener(new View.OnClickListener() {
            @Override
            public 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.coloradmin.cn/o/1644701.html

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

相关文章

Anaconda删除虚拟环境目录pkgs和envs|conda瘦身

这个文件夹里面是专门放不同环境中的包的&#xff0c;只是没有区分环境&#xff0c;都混在一起了&#xff0c; 一般在想要删除一个虚拟环境&#xff0c;除了在命令行中输入conda remove -n your_env_name(虚拟环境名称) --all 然后在envs中删除虚拟环境的文件夹&#xff0c; 还…

RedHat7端口操作/RedHat7开启和关闭防火墙/RedHat7防火墙常用操作常用命令

1、查看当前那些端口被放行了 firewall-cmd --list-port 2、开放指定端口 firewall-cmd --zonepublic --add-port8000/tcp --permanent 3、关闭指定的端口 firewall-cmd --zonepublic --remove-port3306/tcp --permanent 4、重载防火墙配置&#xff0c;让新加入的端口生效…

CTF-WEB(MISC)

安全攻防知识——CTF之MISC - 知乎 CTF之MISC杂项从入门到放弃_ctf杂项 你的名字-CSDN博客 CTF MICS笔记总结_archpr 掩码攻击-CSDN博客 一、图片隐写 CTF杂项---文件类型识别、分离、合并、隐写_ctf图片分离-CSDN博客 EXIF&#xff08;Exchangeable Image File&#xff09;是…

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda-工具安装 (1)】

【学习AI-相关路程-工具使用-自我学习-NVIDIA-cuda &#xff08;1&#xff09;】 1、前言2、环境配置1、对于jetson orin nx 的cuda环境2、对于Ubuntu 20.04下cuda环境 3、自我总结-安装流程1、在ubuntu下&#xff0c;如果想使用cuda平台&#xff0c;应该注意什么 和 都安装什么…

企业开发基础--数据库

今天完成了数据库学习的全部内容&#xff0c;在事务&#xff0c;索引&#xff0c;范式中要有个人逻辑上的理解&#xff0c;也算是卡着点完成了大多数预期&#xff0c;还有一个Java游戏未完成&#xff0c;会后续补上。 之后的一周要完成34道数据库练习题以及JDBC&#xff0c;学…

台式电脑如何找ip地址和端口

随着互联网的深入发展和广泛应用&#xff0c;每台连接到网络的设备都需要一个独特的标识来确保数据传输的准确与高效。对于台式电脑来说&#xff0c;这个标识就是IP地址&#xff0c;而端口则是数据进出的通道。了解如何查找自己台式电脑的IP地址和端口&#xff0c;不仅有助于日…

森林消防泵:守护绿色生命线的无声战士/恒峰智慧科技

在广袤无垠的森林中&#xff0c;生命的绿色如同一块巨大的调色板&#xff0c;为世界增添了无尽的生机与活力。然而&#xff0c;这美丽的画卷也可能因一场突如其来的火灾而瞬间破碎。因此&#xff0c;有一群默默无闻的消防人员&#xff0c;他们配备的是一台台强大的森林消防泵&a…

LeetCode763:划分字母区间

题目描述 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&#xff1a;将所有划分结果按顺序连接&#xff0c;得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的列表。 …

C#知识|上位机UI设计-详情窗体设计思路及流程(实例)

哈喽,你好啊,我是雷工! 上两节练习记录了登录窗体和主窗体的实现过程,本节继续练习内容窗体的实现,以下为练习笔记。 01 详情窗体效果展示: 02 添加窗体并设置属性 在之前练习项目的基础上添加一个Windows窗体,设置名称为:FrmIPManage.cs 设置窗体的边框和标题栏的外…

母婴店运用商城小程序店铺的效果是什么

母婴市场规模高&#xff0c;还可与不少行业无缝衔接&#xff0c;尤其是以90后、00后为主的年轻人&#xff0c;在备孕生育和婴儿护理前后等整体流程往往不惜重金且时间长&#xff0c;母婴用品无疑是必需品&#xff0c;商家需要多方面拓展全面的客户及打通场景随时消费路径。 运…

YUM源仓库部署和NFS共享存储服务

一.YUM源仓库部署 1.YUM 概述 &#xff08;1&#xff09;是基于RPM软件包构建的软件更新机制 &#xff08;2&#xff09;可以自动解决依赖关系 &#xff08;3&#xff09;所有软件包有集中的YUM软件仓库提供 2.准备YUM源 &#xff08;1&#xff09;软件仓库的提供方式&…

CMakeLists.txt语法规则:提供信息的变量说明一

一. 简介 前面几篇文章学习了 CMakeLists.txt语法中 部分常用命令。 接下来学习CMakeLists.txt语法中部分常用变量&#xff0c;变量也是 cmake 中的一个重头戏&#xff0c;cmake 提供了很多内置变量。每一个变量都有它自己的含义&#xff0c;可以通过如下链接地址查询到所有…

大模型的概念与特点

在人工智能的浩瀚星空中&#xff0c;大模型犹如一颗璀璨的明星&#xff0c;引领着技术发展的方向。它们以巨大的参数规模和复杂的计算结构&#xff0c;展现出前所未有的智能潜力。本小节将从大模型的基本概念出发&#xff0c;逐步深入解析其发展历程、特点、分类以及泛化与微调…

【数据库原理及应用】期末复习汇总高校期末真题试卷03

试卷 一、选择题 1 数据库中存储的基本对象是_____。 A 数字 B 记录 C 元组 D 数据 2 下列不属于数据库管理系统主要功能的是_____。 A 数据定义 B 数据组织、存储和管理 C 数据模型转化 D 数据操纵 3 下列不属于数据模型要素的是______。 A 数据结构 B 数据字典 C 数据操作 D…

Docker 入门与实践:从零开始构建容器化应用环境

Docker 一、docker常用命令docker ps 格式化输出Linux设置命令别名 二、数据卷相关命令挂载到默认目录&#xff08;/var/lib/docker&#xff09;挂载到本地目录 三、自定义镜像Dockerfile构建镜像的命令 四、网络自定义网络 五、DockerCompose相关命令 一、docker常用命令 dock…

FreeRTOS为什么要区分任务函数和中断函数?

在我们之前的学习中&#xff0c;队列&#xff0c;信号量&#xff0c;互斥量&#xff0c;事件组&#xff0c;任务通知&#xff0c;它们都有两套函数&#xff0c;在任务中使用或在中断中使用。 1.为什么要用两套函数&#xff1f; 情景1&#xff1a; 我们在写队列的时候等待100…

CDGA|企业的不同阶段如何做数据治理?

随着数字化时代的到来&#xff0c;数据已经成为企业运营和决策的核心要素。因此&#xff0c;数据治理成为企业在不同阶段必须面对的重要课题。 本文将探讨企业在初创期、成长期、成熟期和转型期四个阶段应如何进行数据治理。 初创期&#xff1a;建立数据治理基础 在初创期&…

电子电器架构 --- 主机厂产线的两种刷写方法

电子电器架构 — 主机厂产线的两种刷写方法 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证…

Linux——基础IO2

引入 之前在Linux——基础IO(1)中我们讲的都是(进程打开的文件)被打开的文件 那些未被打开的文件呢&#xff1f; 大部分的文件都是没有被打开的文件&#xff0c;这些文件在哪保存&#xff1f;磁盘(SSD) OS要不要管理磁盘上的文件&#xff1f;(如何让OS快速定位一个文件) 要…

数据库基本概念Day01--基本概念

目录 一. 数据库的基本概念 1. 数据 2. 数据库 3. 数据库管理系统 4. 数据库应用程序 5. 数据库管理员 6. 最终用户 7. 数据库系统 一. 数据库的基本概念 1. 数据 数据&#xff08;Data&#xff09;是指&#xff1a;对客观事物进行描述并乐意鉴别的符号。这些符号可识别的、抽…