Android 原生解析 Json 字符串

Android 原生解析 JSON 字符串

    • [1. JSON 基础](#1. JSON 基础)
    • [2. Android 原生 JSON 解析方法](#2. Android 原生 JSON 解析方法)
      • [2.1 解析 JSON 字符串到 JSONObject](#2.1 解析 JSON 字符串到 JSONObject)
      • [2.2 解析 JSON 数组到 JSONArray](#2.2 解析 JSON 数组到 JSONArray)
      • [2.3 解析嵌套的 JSON 对象](#2.3 解析嵌套的 JSON 对象)
    • [3. 处理异常](#3. 处理异常)
    • [4. 总结](#4. 总结)

在 Android 开发中,我们经常需要从服务器获取 JSON 格式的数据,并将其解析为我们可以操作的对象。尽管 Android 有很多第三方库可以帮助我们解析 JSON(如 Gson、Moshi、Fastjson 等),但了解如何使用 Android 原生工具来解析 JSON 数据对于深入理解 JSON 处理机制是非常有帮助的。

1. JSON 基础

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON 格式的数据通常以键值对的形式出现,支持嵌套结构和数组。

例如,以下是一个简单的 JSON 字符串:

json 复制代码
{
  "name": "John",
  "age": 30,
  "email": "[email protected]",
  "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 类来解析。

java 复制代码
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\":\"[email protected]\"}";

        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 类来解析。

java 复制代码
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 字符串包含嵌套的对象或数组,我们可以递归解析这些数据。

java 复制代码
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 解析是非常有益的。JSONObjectJSONArray 提供了强大的方法来帮助我们处理 JSON 数据,尤其是在需要解析嵌套结构时,能够高效地提取和操作数据。

  1. 使用 JSONObjectJSONArray 解析 JSON 数据。
  2. 处理嵌套的 JSON 对象和数组。
  3. 使用 opt 系列方法避免常见的异常。
相关推荐
沉迷...几秒前
详解.vscode 下的json .vscode文件夹下各个文件的作用
ide·vscode·json
投笔丶从戎1 小时前
Kotlin Multiplatform--01:项目结构基础
android·开发语言·kotlin
Lary_Rock2 小时前
Android 编译问题 prebuilts/clang/host/linux-x86
android·linux·运维
王江奎3 小时前
Android FFmpeg 交叉编译全指南:NDK编译 + CMake 集成
android·ffmpeg
limingade3 小时前
手机打电话通话时如何向对方播放录制的IVR引导词声音
android·智能手机·蓝牙电话·手机提取通话声音
hepherd4 小时前
Flutter 环境搭建 (Android)
android·flutter·visual studio code
_一条咸鱼_4 小时前
揭秘 Android ListView:从源码深度剖析其使用原理
android·面试·android jetpack
_一条咸鱼_4 小时前
深入剖析 Android NestedScrollView 使用原理
android·面试·android jetpack
_一条咸鱼_4 小时前
揭秘 Android ScrollView:深入剖析其使用原理与源码奥秘
android·面试·android jetpack