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

简介: 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">
 
    <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 数据的解析工具,里面最核心的两个类就是JSONArray和JSONObject,这两个是一定要掌握的。最后通过一个例子解析了一个

对象,里面包含一个“工程师”数组,然后通过遍历数据即可得到各个“工程师”对象了。当然,除了 Android 内置的 Json 工具之外,还有很多第三方的解析工具,功能非常强大,但只要理解了 Json 数据格式的使用,各大框架也只是一个轮子的使用而已,大同小异。

目录
相关文章
|
12月前
|
JSON 人工智能 Go
在Golang中序列化JSON字符串的教程
在Golang中,使用`json.Marshal()`可将数据结构序列化为JSON格式。若直接对JSON字符串进行序列化,会因转义字符导致错误。解决方案包括使用`[]byte`或`json.RawMessage()`来避免双引号被转义,从而正确实现JSON的序列化与反序列化。
655 7
|
数据采集 JSON 数据可视化
JSON数据解析实战:从嵌套结构到结构化表格
在信息爆炸的时代,从杂乱数据中提取精准知识图谱是数据侦探的挑战。本文以Google Scholar为例,解析嵌套JSON数据,提取文献信息并转换为结构化表格,通过Graphviz制作技术关系图谱,揭示文献间的隐秘联系。代码涵盖代理IP、请求头设置、JSON解析及可视化,提供完整实战案例。
871 4
JSON数据解析实战:从嵌套结构到结构化表格
|
JSON 监控 网络协议
Bilibili直播信息流:连接方法与数据解析
本文详细介绍了自行实现B站直播WebSocket连接的完整流程。解析了基于WebSocket的应用层协议结构,涵盖认证包构建、心跳机制维护及数据包解析步骤,为开发者定制直播数据监控提供了完整技术方案。
2409 9
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析
|
Java API 数据处理
深潜数据海洋:Java文件读写全面解析与实战指南
通过本文的详细解析与实战示例,您可以系统地掌握Java中各种文件读写操作,从基本的读写到高效的NIO操作,再到文件复制、移动和删除。希望这些内容能够帮助您在实际项目中处理文件数据,提高开发效率和代码质量。
960 4
|
缓存 监控 搜索推荐
【实战解析】smallredbook.item_get_video API:小红书视频数据获取与电商应用指南
本文介绍小红书官方API——`smallredbook.item_get_video`的功能与使用方法。该接口可获取笔记视频详情,包括无水印直链、封面图、时长、文本描述、标签及互动数据等,并支持电商场景分析。调用需提供`key`、`secret`和`num_iid`参数,返回字段涵盖视频链接、标题、标签及用户信息等。同时,文章提供了电商实战技巧,如竞品监控与个性化推荐,并列出合规注意事项及替代方案对比。最后解答了常见问题,如笔记ID获取与视频链接时效性等。
|
存储 缓存 监控
如何高效爬取天猫商品数据?官方API与非官方接口全解析
本文介绍两种天猫商品数据爬取方案:官方API和非官方接口。官方API合法合规,适合企业长期使用,需申请企业资质;非官方接口适合快速验证需求,但需应对反爬机制。详细内容涵盖开发步骤、Python实现示例、反爬策略、数据解析与存储、注意事项及扩展应用场景。推荐工具链包括Playwright、aiohttp、lxml等。如需进一步帮助,请联系作者。
|
JSON API 数据格式
淘宝商品评论API接口系列的应用与数据解析
在电商平台中,用户评论是了解商品质量、服务水平和用户满意度的重要数据来源。淘宝作为中国最大的电商平台,提供了商品评论API接口,帮助开发者获取和分析用户评价数据。本文将介绍淘宝商品评论API接口系列的作用、使用方法,并通过示例展示如何调用API并解析返回的JSON数据。
|
存储 数据采集 JSON
Python爬取某云热歌榜:解析动态加载的歌曲数据
Python爬取某云热歌榜:解析动态加载的歌曲数据
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
925 140
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析

热门文章

最新文章

推荐镜像

更多