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": "john@example.com",
  "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\":\"john@example.com\"}";

        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 系列方法避免常见的异常。
相关推荐
zepcjsj080114 分钟前
简单实现支付密码的页面及输入效果
android
小阳睡不醒1 小时前
小白成长之路-部署Zabbix7(二)
android·运维
mmoyula3 小时前
【RK3568 PWM 子系统(SG90)驱动开发详解】
android·linux·驱动开发
你过来啊你5 小时前
Android用户鉴权实现方案深度分析
android·鉴权
kerli7 小时前
Android 嵌套滑动设计思想
android·客户端
恣艺8 小时前
LeetCode 854:相似度为 K 的字符串
android·算法·leetcode
阿华的代码王国9 小时前
【Android】相对布局应用-登录界面
android·xml·java
用户2070386194910 小时前
StateFlow与SharedFlow如何取舍?
android