在 Java 中处理 JSON 数组

Mohd Mohtashim Nawaz 2023年10月12日
  1. 在 Java 中处理 JSON 数组
  2. Java 中的 JSON 对象和 JSON 数组
  3. 在 Java 中使用 Java 的内置库读取 JSON 数组
  4. 结论
在 Java 中处理 JSON 数组

JSON 是开发人员和组织中流行且广泛使用的数据交换格式。术语 JSON 代表 JavaScript 对象表示法。

它是一个轻量级、可读性和基于文本的框架,专门设计用于促进以人类可读格式进行数据交换。JSON 是一种开放的标准格式,这意味着它可以在没有特殊要求的任何地方使用。

此外,大多数编程语言都支持 JSON。如果你曾经是需要数据交换的项目开发人员,你可能会遇到过 JSON。

例如,我们经常使用 JSON 对象将数据从服务器传输到移动应用程序,反之亦然。本文将了解 JSON 基础知识,例如 JSON 的结构、数据类型、JSON 对象、JSON 数组等。

我们还将了解如何在 Java 中使用 JSON。最后,本文提供了一个在 Java 中处理 JSON 的示例代码。

在 Java 中处理 JSON 数组

JSON 是一个非常灵活和轻量级的信息共享框架,我们使用对象和数据类型来创建和共享信息。

在 JSON 中,数据表示为键值对,其中键具体是一个字符串,而值可以是 JSON 支持的任何数据类型。

JSON 支持以下数据类型。

  1. 字符串
  2. 数字
  3. 布尔型
  4. 空值

除了这些基本的 JSON 数据类型,我们还可以使用 JSON Arrays 和 JSON Objects 作为键值对中的值。

此外,在本文中,我们将更多地研究数组和对象。但在此之前,我们先来看看 JSON 的特点。

JSON 的一些突出特性如下。

  1. JSON 非常简单。你不必付出任何额外的努力来理解和使用 JSON。
  2. JSON 易于理解和自我描述。通过查看 JSON 对象,你可以轻松理解它要传达的内容。
  3. JSON 与语言无关。这个特性已被证明是 JSON 被广泛接受的一个主要因素。在库和简单代码的帮助下,我们可以使用几乎所有语言的 JSON。
  4. JSON 比 XML 快。这是广泛使用它的另一个原因。

Java 中的 JSON 对象和 JSON 数组

在我们学习在 Java 中使用 JSON 对象和数组之前,我们应该了解 JSON 对象和 JSON 数组。

JSON 对象与字典数据类型非常相似,其中数据存储为键值对。此键值对中的键应该是字符串,而值可以是对象、数组或任何其他受支持的数据类型。

我们必须用冒号 : 分隔键和值,并用逗号 , 分隔每个键值对。JSON 对象使用大括号 {} 表示。

我们可以通过将对象和数组嵌套到我们的 JSON 对象中来制作任意复杂的 JSON 对象。它被称为分层 JSON 对象。

下面是一个表示学生详细信息的 JSON 对象示例。

{"name": "Roger", "Roll": 22, "Class": "XI"}

请注意,我们已经用双转换逗号引​​用了字符串值,而数字不需要引用。

我们刚刚讨论了类似于字典的 JSON 对象。另一方面,JSON 数组类似于列表。

我们将对象括在列表中的方括号 [] 中。JSON 数组可以包含任何受支持的数据类型,包括另一个数组或 JSON 对象。

这是 JSON 数组的示例。

[1, "abc", {"name":"xyz"}]

请注意,上面的 JSON 数组包含一个数字、一个字符串和一个对象。这意味着我们可以在数组中存储不同的数据类型。

在 Java 中使用 Java 的内置库读取 JSON 数组

Java 是一种功能强大的语言,拥有大量的库。幸运的是,我们有内置库来读取 Java 中的 JSON 对象和数组。

此类库有助于我们的工作,并使解析和读取 JSON 对象和数组变得简单。在本文中,我们将学习在代码中使用此类库来读取 Java 中的 JSON 对象和 JSON 数组。

在继续编写代码之前,我们创建一个 JSON 对象并将其存储在一个文件中。请注意,JSON 文件的扩展名为 .json

因此,如果你想测试和执行代码,请复制并粘贴以下 JSON 代码,并将扩展名为 .json 的文件保存在任何所需位置。JSON 代码如下所示。

[{
	"name":"MMN",
	"roll": 24,
	"marks": [91, 95, 97, 97, 94],
	"parents": {
	"name": "IMT",
	"mobile":"1234567890"
	},
	"hobbies": ["sports", "reading", "music"],
	"others": ["A", 1]
}]

你应该注意,此 JSON 文件包含一个带有单个 JSON 对象的 JSON 数组。然后,这个内部 JSON 对象包含几个具有不同数据类型的键值对。

例如,name 是一个字符串,roll 是一个整数(注意 JSON 将整数存储为长整数),marks 是一个 JSON 数组,parents 是另一个 JSON 对象,等等。因此,这是任意复杂 JSON 数据的示例。

让我们了解如何使用 Java 读取这样的 JSON 对象。

在编写代码之前,你必须确保已下载 JSON jar 文件并添加指向该 JSON 文件的 classpath 变量。如果你不这样做,JSON 将不会被编译。

我们可以像在 Java 中打开任何其他文件一样打开 JSON 文件,主要是使用 File() 构造函数。

我们必须用 try-catch 块包围文件打开语句,以处理构造函数抛出的必要异常。

一旦文件打开,它的对象就会被传递给 FileReader() 构造函数。

我们使用返回 Java 对象的 JSON 解析器来解析 JSON 内容。我们应该使用显式转换来转换 JSON 数组。

我们的 JSON 数组包含一个对象,但在某些情况下,一个 JSON 数组中可能有多个 JSON 对象,因此我们应该使用循环遍历解析后的数组。我们从解析的 JSON 数组中提取每个 JSON 对象并进一步处理它。

请注意,我们应该知道我们正在迭代的 JSON 对象结构,因为我们需要使用键提取 JSON 对象中的值。

此外,我们通过将 JSON 对象传递给使用命名键的函数来提取数据。由于 JSON 对象包含不同的数据类型,因此可以相应地进行处理。

例如,我们显示了整数、字符串和数组,但迭代了嵌套的 JSON 对象 parents。下面的代码实现了解释的逻辑。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;

public class JSONReader {
  public static void main(String[] args) {
    JSONParser parser = new JSONParser();
    FileReader fileReader;
    try {
      File file = new File("/home/stark/eclipse-workspace-java/Aditya/src/data.json");
      fileReader = new FileReader(file);
      // Parser returns an object, we need an explicit cast to covert it into a JSONArray
      JSONArray array = (JSONArray) parser.parse(fileReader);

      // Traverse the list
      for (int i = 0; i < array.size(); i++) {
        JSONObject obj = (JSONObject) array.get(i);
        parseObject(obj);
      }

    }

    catch (FileNotFoundException e) {
      System.out.println(e.getStackTrace() + " :File Not Found");
    } catch (ParseException e) {
      System.out.println(e.getStackTrace() + " :Could not parse");
    } catch (IOException e) {
      System.out.println(e.getStackTrace() + " :IOException");
    }
  }

  private static void parseObject(JSONObject obj) {
    String name = (String) obj.get("name");
    long roll = (long) obj.get("roll");
    JSONArray marks = (JSONArray) obj.get("marks");
    JSONArray hobbies = (JSONArray) obj.get("hobbies");
    JSONObject parents = (JSONObject) obj.get("parents");
    JSONArray others = (JSONArray) obj.get("others");

    System.out.println("Name: " + name);
    System.out.println("Roll: " + roll);
    System.out.println("Marks: " + marks);
    System.out.println("Hobbies: " + hobbies);
    System.out.println(
        "Parent's Name: " + parents.get("name") + ", Mobile: " + parents.get("mobile"));
    System.out.println("Others: " + others);
  }
}

你应该在 File() 构造函数中指定文件的正确路径。上面代码的输出如下。

Name: MMN
Roll: 24
Marks: [91,95,97,97,94]
Hobbies: ["sports","reading","music"]
Parent's Name: IMT, Mobile: 1234567890
Others: ["A",1]

结论

Java 是一种流行的编程语言,我们经常遇到需要数据交换的情况。尽管存在其他数据交换格式,但 JSON 是最流行、最简单且易于理解的格式之一。

我们已经学习了 JSON 格式、它的数据类型以及用 Java 解析的 JSON 文件。JSON 可以具有任意复杂的结构,使我们能够交换任何 JSON 数据。

另一方面,Java 提供了一种简单、独特但功能强大的方法来处理 JSON。

相关文章 - Java JSON