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 系列方法避免常见的异常。
相关推荐
stevenzqzq10 分钟前
Android studio xml布局预览中 Automotive和Autotive Distant Display的区别
android·xml·android studio
QING6181 小时前
Kotlin commonPrefixWith用法及代码示例
android·kotlin·源码阅读
QING6181 小时前
Kotlin groupByTo用法及代码示例
android·kotlin·源码阅读
兰琛6 小时前
Compose组件转换XML布局
android·xml·kotlin
水w8 小时前
【Android Studio】解决报错问题Algorithm HmacPBESHA256 not available
android·开发语言·android studio
inxunoffice9 小时前
按规则批量修改 txt/html/json/xml/csv/记事本等文本文件内容
xml·json
隐-梵10 小时前
Android studio进阶教程之(二)--如何导入高德地图
android·ide·android studio
Kika写代码10 小时前
【Android】界面布局-线性布局LinearLayout-例子
android·gitee
wangz7611 小时前
kotlin,jetpack compose,使用DataStore保存数据,让程序下次启动时自动获取
android·kotlin·datastore·jetpack compose
Thread.sleep(0)12 小时前
WebRTC源码解析:Android如何渲染画面
android·webrtc