Java JSON数据的编码和解码(附带实例)
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。所谓轻量级,是与 XML 文档结构相比而言的。因为描述项目的字符少,所以描述相同数据所需的字符个数要少,那么传输速度就会提高,而流量却会减少。
构成 JSON 文档的两种结构为对象和数组。对象是“名称-值”对集合,它类似于 Java 中的 Map 类型,而数组是一连串元素的集合。
对象是一个无序的“名称-值”对集合,一个对象以“{”(左大括号)开始,“}”(右大括号)结束。每个“名称”后跟一个“:”(冒号),“名称-值”对之间使用“,”(逗号)分隔。JSON对象的语法表如下图所示。

图 1 JSON对象的语法表
下面是一个 JSON 对象的例子:

图 2 JSON数组的语法表
下面是一个 JSON 数组的例子:

图 3 JSON值
JSON-java 库提供源代码,最重要的是它不依赖于其他第三方库,不需要再去找其他的库。可以通过网址 https://github.com/stleary/JSON-java 下载源代码。可以访问 API 在线文档 http://stleary.github.io/JSON-java/index.html。
下载 JSON-java 库源代码文件,解压后的文件如下图所示,其中源代码文件在 src\main\java 目录下,org\json 是包。

图 4 解压后的文件
将 JSON-java 库源代码文件添加到 IntelliJ IDEA 工程中,需要将 JSON-java 库中 src\main\java 目录下的源代码(org 文件夹)复制到 IntelliJ IDEA 工程的 src 文件夹中,如下图所示。

图 5 将JSON-java库源代码文件添加到IntelliJ IDEA工程
由于操作系统的资源管理器与 IntelliJ IDEA 工具之间可以互相复制粘贴,IntelliJ IDEA 中复制和粘贴操作的快捷键和快捷菜单与操作系统下完全一样。
编码和解码过程就像发电报时发送方把语言变成能够传输的符号,而接收时要将符号转换成为能够看懂的语言。
下面具体介绍一下 JSON 数据的编码和解码过程。
1) 编码示例代码如下:
2) 编码示例代码如下:
构成 JSON 文档的两种结构为对象和数组。对象是“名称-值”对集合,它类似于 Java 中的 Map 类型,而数组是一连串元素的集合。
对象是一个无序的“名称-值”对集合,一个对象以“{”(左大括号)开始,“}”(右大括号)结束。每个“名称”后跟一个“:”(冒号),“名称-值”对之间使用“,”(逗号)分隔。JSON对象的语法表如下图所示。

图 1 JSON对象的语法表
下面是一个 JSON 对象的例子:
{ "name": "a.htm", "size": 345, "saved": true }数组是值的有序集合,以“[”(左中括号)开始,“]”(右中括号)结束,值之间使用“,”(逗号)分隔。JSON 数组的语法表如下图所示。

图 2 JSON数组的语法表
下面是一个 JSON 数组的例子:
["text","html","css"]在数组中,值可以是双引号括起来的字符串、数值、true、false、null、对象或者数组,而且这些结构可以嵌套。数组中的 JSON 值如下图所示。

图 3 JSON值
Java使用第三方JSON库
由于目前 Java 官方没有提供 JSON 编码和解码所需要的类库,因此需要使用第三方 JSON库,这里推荐 JSON-java 库。JSON-java 库提供源代码,最重要的是它不依赖于其他第三方库,不需要再去找其他的库。可以通过网址 https://github.com/stleary/JSON-java 下载源代码。可以访问 API 在线文档 http://stleary.github.io/JSON-java/index.html。
下载 JSON-java 库源代码文件,解压后的文件如下图所示,其中源代码文件在 src\main\java 目录下,org\json 是包。

图 4 解压后的文件
将 JSON-java 库源代码文件添加到 IntelliJ IDEA 工程中,需要将 JSON-java 库中 src\main\java 目录下的源代码(org 文件夹)复制到 IntelliJ IDEA 工程的 src 文件夹中,如下图所示。

图 5 将JSON-java库源代码文件添加到IntelliJ IDEA工程
由于操作系统的资源管理器与 IntelliJ IDEA 工具之间可以互相复制粘贴,IntelliJ IDEA 中复制和粘贴操作的快捷键和快捷菜单与操作系统下完全一样。
JSON数据编码和解码
JSON 在进行数据交换时,它们存在的形式就是一个很长的字符串,这个字符串在网络中传输或者存储于磁盘等介质中。在传输和存储之前需要把 JSON 数据转换成为字符串,这个过程称为“编码”过程。接收方需要将接收到的字符串转换成为 JSON 数据,这个过程称为“解码”过程。编码和解码过程就像发电报时发送方把语言变成能够传输的符号,而接收时要将符号转换成为能够看懂的语言。
下面具体介绍一下 JSON 数据的编码和解码过程。
1) 编码示例代码如下:
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; // JSON 数据编码和解码 public class CodeExample { public static void main(String args[]) { // {"name": "tony", "age": 30, "a": [1, 3]} try { JSONObject jsonObject = new JSONObject(); // 创建 JSONObject (JSON 对象) jsonObject.put("name", "tony"); // 添加数据项到 jsonObject jsonObject.put("age", 30); // 添加数据项到 jsonObject JSONArray jsonArray = new JSONArray(); // 创建 JSONArray jsonArray.put(1).put(3); // 向 JSON 数组中添加 1 和 3 两个元素 jsonObject.put("a", jsonArray); // 将 JSON 数组添加到 JSON 对象中 // 编码完成 System.out.println(jsonObject.toString()); // 将 JSON 对象转换为字符串 } catch (JSONException e) { e.printStackTrace(); } } }运行上述示例,控制台输出结果:
{"a":[1,3],"name":"tony","age":30}
2) 编码示例代码如下:
import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; public class DecodingExample { public static void main(String args[]) { // JSON 字符串 String jsonString = "{\"name\":\"tony\", \"age\":30, \"a\":[1, 3]}"; try { // 通过 JSON 字符串创建 JSON 对象 JSONObject jsonObject = new JSONObject(jsonString); // 从 JSON 对象中按照名称取出 JSON 中对应的数据 String name = jsonObject.getString("name"); System.out.println("name : " + name); int age = jsonObject.getInt("age"); System.out.println("age : " + age); // 取出一个 JSON 数组对象 JSONArray jsonArray = jsonObject.getJSONArray("a"); // 取出 JSON 数组第一个元素 int n1 = jsonArray.getInt(0); System.out.println("数组 a 第一个元素 : " + n1); int n2 = jsonArray.getInt(1); System.out.println("数组 a 第二个元素 : " + n2); } catch (JSONException e) { e.printStackTrace(); } } }运行上述示例,控制台输出结果:
name:tony
age:30
数组a第一个元素:1
数组a第二个元素:3