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 系列方法避免常见的异常。
相关推荐
xiangpanf2 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
电商API&Tina4 小时前
【电商API接口】开发者一站式电商API接入说明
大数据·数据库·人工智能·云计算·json
robotx5 小时前
安卓线程相关
android
消失的旧时光-19435 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon6 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon6 小时前
VSYNC 信号完整流程2
android
dalancon6 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户69371750013847 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android8 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才8 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android