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 系列方法避免常见的异常。
相关推荐
雨白43 分钟前
Jetpack系列(二):Lifecycle与LiveData结合,打造响应式UI
android·android jetpack
葬歌倾城1 小时前
JSON的缩进格式方式和紧凑格式方式
c#·json
kk爱闹2 小时前
【挑战14天学完python和pytorch】- day01
android·pytorch·python
每次的天空4 小时前
Android-自定义View的实战学习总结
android·学习·kotlin·音视频
恋猫de小郭4 小时前
Flutter Widget Preview 功能已合并到 master,提前在体验毛坯的预览支持
android·flutter·ios
断剑重铸之日5 小时前
Android自定义相机开发(类似OCR扫描相机)
android
随心最为安5 小时前
Android Library Maven 发布完整流程指南
android
岁月玲珑6 小时前
【使用Android Studio调试手机app时候手机老掉线问题】
android·ide·android studio
还鮟10 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡11 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio