- JSON.simple 教程
- JSON.simple - 首页
- JSON.simple - 概述
- JSON.simple - 环境设置
- JSON.simple - JAVA映射
- 解码示例
- 转义特殊字符
- JSON.simple - 使用JSONValue
- JSON.simple - 异常处理
- JSON.simple - 容器工厂
- JSON.simple - 内容处理器
- 编码示例
- JSON.simple - 编码JSONObject
- JSON.simple - 编码JSONArray
- 合并示例
- JSON.simple - 合并对象
- JSON.simple - 合并数组
- 组合示例
- JSON.simple - 原生类型、对象、数组
- JSON.simple - 原生类型、Map、List
- 原生类型、对象、Map、List
- 自定义示例
- JSON.simple - 自定义输出
- 自定义输出流
- JSON.simple 有用资源
- JSON.simple 快速指南
- JSON.simple - 有用资源
- JSON.simple - 讨论
JSON.simple 快速指南
JSON.simple - 概述
JSON.simple 是一个简单的基于 Java 的 JSON 工具包。您可以使用 JSON.simple 来编码或解码 JSON 数据。
特性
规范兼容 − JSON.simple 完全符合 JSON 规范 - RFC4627。
轻量级 − 它只有很少的类,并提供必要的编码/解码和 JSON 转义功能。
重用集合 − 大多数操作都是使用 Map/List 接口完成的,提高了可重用性。
支持流 − 支持 JSON 输出文本的流处理。
类似 SAX 的内容处理器 − 提供类似 SAX 的接口来流式处理大量 JSON 数据。
高性能 − 使用基于堆的解析器,提供高性能。
无依赖性 − 没有外部库依赖性。可以独立包含。
JDK1.2 兼容 − 源代码和二进制文件都与 JDK1.2 兼容
JSON.simple - 环境设置
本地环境设置
JSON.simple 是一个 Java 库,因此首要要求是在您的机器上安装 JDK。
系统需求
JDK | 内存 | 磁盘空间 | 操作系统 |
---|---|---|---|
1.5 或更高版本。 | 没有最低要求。 | 没有最低要求。 | 没有最低要求。 |
步骤 1:验证您的机器上是否安装了 Java
首先,打开控制台并执行基于您正在使用的操作系统的 java 命令。
操作系统 | 任务 | 命令 |
---|---|---|
Windows | 打开命令控制台 | c:\> java -version |
Linux | 打开命令终端 | $ java -version |
Mac | 打开终端 | machine:< joseph$ java -version |
让我们验证所有操作系统的输出:
操作系统 | 输出 |
---|---|
Windows | java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101) |
Linux | java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101) |
Mac | java version "1.8.0_101" Java(TM) SE Runtime Environment (build 1.8.0_101) |
如果您的系统上没有安装 Java,请从以下链接下载 Java 软件开发工具包 (SDK) www.oracle.com。在本教程中,我们假设 Java 1.8.0_101 为已安装版本。
步骤 2:设置 JAVA 环境
设置JAVA_HOME环境变量以指向 Java 安装在您机器上的基目录位置。例如:
操作系统 | 输出 |
---|---|
Windows | 将环境变量 JAVA_HOME 设置为 C:\Program Files\Java\jdk1.8.0_101 |
Linux | export JAVA_HOME = /usr/local/java-current |
Mac | export JAVA_HOME = /Library/Java/Home |
将 Java 编译器位置添加到系统路径。
操作系统 | 输出 |
---|---|
Windows | 在系统变量Path的末尾追加字符串C:\Program Files\Java\jdk1.8.0_101\bin。 |
Linux | export PATH = $PATH:$JAVA_HOME/bin/ |
Mac | 无需设置 |
使用上面解释的命令java -version验证 Java 安装。
步骤 3:下载 JSON.simple 存档
从 json-simple @ MVNRepository下载最新版本的 JSON.simple jar 文件。在撰写本教程时,我们下载了 json-simple-1.1.1.jar,并将其复制到 C:\>JSON 文件夹中。
操作系统 | 存档名称 |
---|---|
Windows | json-simple-1.1.1.jar |
Linux | json-simple-1.1.1.jar |
Mac | json-simple-1.1.1.jar |
步骤 4:设置 JSON_JAVA 环境
设置JSON_JAVA环境变量以指向 JSON.simple jar 存储在您机器上的基目录位置。假设我们将 json-simple-1.1.1.jar 存储在 JSON 文件夹中。
序号 | 操作系统和说明 |
---|---|
1 | Windows 将环境变量 JSON_JAVA 设置为 C:\JSON |
2 | Linux export JSON_JAVA = /usr/local/JSON |
3 | Mac export JSON_JAVA = /Library/JSON |
步骤 5:设置 CLASSPATH 变量
设置CLASSPATH环境变量以指向 JSON.simple jar 位置。
序号 | 操作系统和说明 |
---|---|
1 | Windows 将环境变量 CLASSPATH 设置为 %CLASSPATH%;%JSON_JAVA%\json-simple-1.1.1.jar;.; |
2 | Linux export CLASSPATH = $CLASSPATH:$JSON_JAVA/json-simple-1.1.1.jar:. |
3 | Mac export CLASSPATH = $CLASSPATH:$JSON_JAVA/json-simple-1.1.1.jar:. |
JSON.simple - JAVA映射
在解码或解析时,JSON.simple 将左侧的实体映射到右侧,而在编码时将右侧的实体映射到左侧。
JSON | Java |
---|---|
字符串 | java.lang.String |
数字 | java.lang.Number |
true|false | java.lang.Boolean |
null | null |
数组 | java.util.List |
对象 | java.util.Map |
解码时,java.util.List 的默认具体类是 org.json.simple.JSONArray,java.util.Map 的默认具体类是 org.json.simple.JSONObject。
JSON.simple - 转义特殊字符
以下字符是保留字符,不能在 JSON 中使用,必须正确转义才能在字符串中使用。
退格键 将被替换为 \b
换页符 将被替换为 \f
换行符 将被替换为 \n
回车符 将被替换为 \r
制表符 将被替换为 \t
双引号 将被替换为 \"
反斜杠 将被替换为 \\
JSONObject.escape() 方法可以用来转义 JSON 字符串中的这些保留关键字。以下是一个示例:
示例
import org.json.simple.JSONObject; public class JsonDemo { public static void main(String[] args) { JSONObject jsonObject = new JSONObject(); String text = "Text with special character /\"\'\b\f\t\r\n."; System.out.println(text); System.out.println("After escaping."); text = jsonObject.escape(text); System.out.println(text); } }
输出
Text with special character /"' . After escaping. Text with special character \/\"'\b\f\t\r\n.
JSON.simple - 使用JSONValue
JSONValue 提供了一个静态方法 parse() 来解析给定的 json 字符串,返回一个 JSONObject,然后可以使用它来获取解析的值。请参见下面的示例:
示例
import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.JSONValue; public class JsonDemo { public static void main(String[] args) { String s = "[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]"; Object obj = JSONValue.parse(s); JSONArray array = (JSONArray)obj; System.out.println("The 2nd element of array"); System.out.println(array.get(1)); System.out.println(); JSONObject obj2 = (JSONObject)array.get(1); System.out.println("Field \"1\""); System.out.println(obj2.get("1")); s = "{}"; obj = JSONValue.parse(s); System.out.println(obj); s = "[5,]"; obj = JSONValue.parse(s); System.out.println(obj); s = "[5,,2]"; obj = JSONValue.parse(s); System.out.println(obj); } }
输出
The 2nd element of array {"1":{"2":{"3":{"4":[5,{"6":7}]}}}} Field "1" {"2":{"3":{"4":[5,{"6":7}]}}} {} [5] [5,2]
JSON.simple - 异常处理
JSONParser.parse() 在 JSON 无效的情况下会抛出 ParseException。下面的示例显示了如何处理 ParseException。
示例
import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; class JsonDemo { public static void main(String[] args) { JSONParser parser = new JSONParser(); String text = "[[null, 123.45, \"a\tb c\"]}, true"; try{ Object obj = parser.parse(text); System.out.println(obj); }catch(ParseException pe) { System.out.println("position: " + pe.getPosition()); System.out.println(pe); } } }
输出
position: 24 Unexpected token RIGHT BRACE(}) at position 24.
JSON.simple - 容器工厂
ContainerFactory 可用于为解析的 JSON 对象/数组创建自定义容器。首先,我们需要创建一个 ContainerFactory 对象,然后在 JSONParser 的 parse 方法中使用它来获取所需的对象。请参见下面的示例:
示例
import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.json.simple.parser.ContainerFactory; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; class JsonDemo { public static void main(String[] args) { JSONParser parser = new JSONParser(); String text = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}"; ContainerFactory containerFactory = new ContainerFactory() { @Override public Map createObjectContainer() { return new LinkedHashMap<>(); } @Override public List creatArrayContainer() { return new LinkedList<>(); } }; try { Map map = (Map)parser.parse(text, containerFactory); map.forEach((k,v)->System.out.println("Key : " + k + " Value : " + v)); } catch(ParseException pe) { System.out.println("position: " + pe.getPosition()); System.out.println(pe); } } }
输出
Key : first Value : 123 Key : second Value : [4, 5, 6] Key : third Value : 789
JSON.simple - 内容处理器
ContentHandler 接口用于提供类似 SAX 的接口来流式处理大型 json。它也提供可停止功能。下面的示例说明了这个概念。
示例
import java.io.IOException; import java.util.List; import java.util.Stack; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.ContentHandler; import org.json.simple.parser.JSONParser; import org.json.simple.parser.ParseException; class JsonDemo { public static void main(String[] args) { JSONParser parser = new JSONParser(); String text = "{\"first\": 123, \"second\": [4, 5, 6], \"third\": 789}"; try { CustomContentHandler handler = new CustomContentHandler(); parser.parse(text, handler,true); } catch(ParseException pe) { } } } class CustomContentHandler implements ContentHandler { @Override public boolean endArray() throws ParseException, IOException { System.out.println("inside endArray"); return true; } @Override public void endJSON() throws ParseException, IOException { System.out.println("inside endJSON"); } @Override public boolean endObject() throws ParseException, IOException { System.out.println("inside endObject"); return true; } @Override public boolean endObjectEntry() throws ParseException, IOException { System.out.println("inside endObjectEntry"); return true; } public boolean primitive(Object value) throws ParseException, IOException { System.out.println("inside primitive: " + value); return true; } @Override public boolean startArray() throws ParseException, IOException { System.out.println("inside startArray"); return true; } @Override public void startJSON() throws ParseException, IOException { System.out.println("inside startJSON"); } @Override public boolean startObject() throws ParseException, IOException { System.out.println("inside startObject"); return true; } @Override public boolean startObjectEntry(String key) throws ParseException, IOException { System.out.println("inside startObjectEntry: " + key); return true; } }
输出
inside startJSON inside startObject inside startObjectEntry: first inside primitive: 123 inside endObjectEntry inside startObjectEntry: second inside startArray inside primitive: 4 inside primitive: 5 inside primitive: 6 inside endArray inside endObjectEntry inside startObjectEntry: third inside primitive: 789 inside endObjectEntry inside endObject inside endJSON
JSON.simple - 编码JSONObject
使用 JSON.simple,我们可以通过以下方式编码 JSON 对象:
编码 JSON 对象 - 到字符串 - 简单编码。
编码 JSON 对象 - 流 - 输出可用于流处理。
编码 JSON 对象 - 使用 Map - 保持顺序的编码。
编码 JSON 对象 - 使用 Map 和流 - 保持顺序并进行流处理的编码。
下面的示例说明了上述概念。
示例
import java.io.IOException; import java.io.StringWriter; import java.util.LinkedHashMap; import java.util.Map; import org.json.simple.JSONObject; import org.json.simple.JSONValue; class JsonDemo { public static void main(String[] args) throws IOException { JSONObject obj = new JSONObject(); String jsonText; obj.put("name", "foo"); obj.put("num", new Integer(100)); obj.put("balance", new Double(1000.21)); obj.put("is_vip", new Boolean(true)); jsonText = obj.toString(); System.out.println("Encode a JSON Object - to String"); System.out.print(jsonText); StringWriter out = new StringWriter(); obj.writeJSONString(out); jsonText = out.toString(); System.out.println("\nEncode a JSON Object - Streaming"); System.out.print(jsonText); Map obj1 = new LinkedHashMap(); obj1.put("name", "foo"); obj1.put("num", new Integer(100)); obj1.put("balance", new Double(1000.21)); obj1.put("is_vip", new Boolean(true)); jsonText = JSONValue.toJSONString(obj1); System.out.println("\nEncode a JSON Object - Preserving Order"); System.out.print(jsonText); out = new StringWriter(); JSONValue.writeJSONString(obj1, out); jsonText = out.toString(); System.out.println("\nEncode a JSON Object - Preserving Order and Stream"); System.out.print(jsonText); } }
输出
Encode a JSON Object - to String {"balance":1000.21,"is_vip":true,"num":100,"name":"foo"} Encode a JSON Object - Streaming {"balance":1000.21,"is_vip":true,"num":100,"name":"foo"} Encode a JSON Object - Preserving Order {"name":"foo","num":100,"balance":1000.21,"is_vip":true} Encode a JSON Object - Preserving Order and Stream {"name":"foo","num":100,"balance":1000.21,"is_vip":true}
JSON.simple - 编码JSONArray
使用 JSON.simple,我们可以通过以下方式编码 JSON 数组:
编码 JSON 数组 - 到字符串 - 简单编码。
编码 JSON 数组 - 流 - 输出可用于流处理。
编码 JSON 数组 - 使用 List - 使用 List 进行编码。
编码 JSON 数组 - 使用 List 和流 - 使用 List 并进行流处理的编码。
下面的示例说明了上述概念。
示例
import java.io.IOException; import java.io.StringWriter; import java.util.LinkedList; import java.util.List; import org.json.simple.JSONArray; import org.json.simple.JSONValue; class JsonDemo { public static void main(String[] args) throws IOException { JSONArray list = new JSONArray(); String jsonText; list.add("foo"); list.add(new Integer(100)); list.add(new Double(1000.21)); list.add(new Boolean(true)); list.add(null); jsonText = list.toString(); System.out.println("Encode a JSON Array - to String"); System.out.print(jsonText); StringWriter out = new StringWriter(); list.writeJSONString(out); jsonText = out.toString(); System.out.println("\nEncode a JSON Array - Streaming"); System.out.print(jsonText); List list1 = new LinkedList(); list1.add("foo"); list1.add(new Integer(100)); list1.add(new Double(1000.21)); list1.add(new Boolean(true)); list1.add(null); jsonText = JSONValue.toJSONString(list1); System.out.println("\nEncode a JSON Array - Using List"); System.out.print(jsonText); out = new StringWriter(); JSONValue.writeJSONString(list1, out); jsonText = out.toString(); System.out.println("\nEncode a JSON Array - Using List and Stream"); System.out.print(jsonText); } }
输出
Encode a JSON Array - to String ["foo",100,1000.21,true,null] Encode a JSON Array - Streaming ["foo",100,1000.21,true,null] Encode a JSON Array - Using List ["foo",100,1000.21,true,null] Encode a JSON Array - Using List and Stream ["foo",100,1000.21,true,null]
JSON.simple - 合并对象
在 JSON.simple 中,我们可以使用 JSONObject.putAll() 方法轻松合并两个 JSON 对象。
下面的示例说明了上述概念。
示例
import java.io.IOException; import org.json.simple.JSONObject; class JsonDemo { public static void main(String[] args) throws IOException { JSONObject obj1 = new JSONObject(); obj1.put("name", "foo"); obj1.put("num", new Integer(100)); JSONObject obj2 = new JSONObject(); obj2.put("balance", new Double(1000.21)); obj2.put("is_vip", new Boolean(true)); obj1.putAll(obj2); System.out.println(obj1); } }
输出
{"balance":1000.21,"is_vip":true,"num":100,"name":"foo"}
JSON.simple - 合并数组
在 JSON.simple 中,我们可以使用 JSONArray.addAll() 方法轻松合并两个 JSON 数组。
下面的示例说明了上述概念。
示例
import java.io.IOException; import org.json.simple.JSONArray; class JsonDemo { public static void main(String[] args) throws IOException { JSONArray list1 = new JSONArray(); list1.add("foo"); list1.add(new Integer(100)); JSONArray list2 = new JSONArray(); list2.add(new Double(1000.21)); list2.add(new Boolean(true)); list2.add(null); list1.addAll(list2); System.out.println(list1); } }
输出
["foo",100,1000.21,true,null]
JSON.simple - 原生类型、对象、数组
使用 JSONArray 对象,我们可以创建一个包含原生类型、对象和数组的 JSON。
下面的示例说明了上述概念。
示例
import java.io.IOException; import org.json.simple.JSONArray; import org.json.simple.JSONObject; class JsonDemo { public static void main(String[] args) throws IOException { JSONArray list1 = new JSONArray(); list1.add("foo"); list1.add(new Integer(100)); JSONArray list2 = new JSONArray(); list2.add(new Double(1000.21)); list2.add(new Boolean(true)); list2.add(null); JSONObject obj = new JSONObject(); obj.put("name", "foo"); obj.put("num", new Integer(100)); obj.put("balance", new Double(1000.21)); obj.put("is_vip", new Boolean(true)); obj.put("list1", list1); obj.put("list2", list2); System.out.println(obj); } }
输出
{"list1":["foo",100],"balance":1000.21,"is_vip":true,"num":100,"list2":[1000.21,true,null],"name":"foo"}
JSON.simple - 原生类型、Map、List 组合
使用 JSONValue 对象,我们可以创建一个包含原生类型、Map 和 List 的 JSON。
下面的示例说明了上述概念。
示例
import java.io.IOException; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.json.simple.JSONValue; class JsonDemo { public static void main(String[] args) throws IOException { Map m1 = new LinkedHashMap(); m1.put("k11","v11"); m1.put("k12","v12"); m1.put("k13", "v13"); List l1 = new LinkedList(); l1.add(m1); l1.add(new Integer(100)); String jsonString = JSONValue.toJSONString(l1); System.out.println(jsonString); } }
输出
[{"k11":"v11","k12":"v12","k13":"v13"},100]
JSON.simple - 原生类型、对象、Map、List
使用 JSONValue 对象,我们可以创建一个包含原生类型、对象、Map 和 List 的 JSON。
下面的示例说明了上述概念。
示例
import java.io.IOException; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import org.json.simple.JSONObject; import org.json.simple.JSONValue; class JsonDemo { public static void main(String[] args) throws IOException { JSONObject obj = new JSONObject(); Map m1 = new LinkedHashMap(); m1.put("k11","v11"); m1.put("k12","v12"); m1.put("k13", "v13"); List l1 = new LinkedList(); l1.add(new Integer(100)); obj.put("m1", m1); obj.put("l1", l1); String jsonString = JSONValue.toJSONString(obj); System.out.println(jsonString); } }
输出
{"m1":{"k11":"v11","k12":"v12","k13":"v13"},"l1":[100]}
JSON.simple - 自定义输出
我们可以根据自定义类自定义 JSON 输出。唯一的要求是实现 JSONAware 接口。
下面的示例说明了上述概念。
示例
import java.io.IOException; import org.json.simple.JSONArray; import org.json.simple.JSONAware; import org.json.simple.JSONObject; class JsonDemo { public static void main(String[] args) throws IOException { JSONArray students = new JSONArray(); students.add(new Student(1,"Robert")); students.add(new Student(2,"Julia")); System.out.println(students); } } class Student implements JSONAware { int rollNo; String name; Student(int rollNo, String name){ this.rollNo = rollNo; this.name = name; } @Override public String toJSONString() { StringBuilder sb = new StringBuilder(); sb.append("{"); sb.append("name"); sb.append(":"); sb.append("\"" + JSONObject.escape(name) + "\""); sb.append(","); sb.append("rollNo"); sb.append(":"); sb.append(rollNo); sb.append("}"); return sb.toString(); } }
输出
[{name:"Robert",rollNo:1},{name:"Julia",rollNo:2}]
JSON.simple - 自定义输出流
我们可以根据自定义类自定义 JSON 流输出。唯一的要求是实现 JSONStreamAware 接口。
下面的示例说明了上述概念。
示例
import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.LinkedHashMap; import java.util.Map; import org.json.simple.JSONArray; import org.json.simple.JSONStreamAware; import org.json.simple.JSONValue; class JsonDemo { public static void main(String[] args) throws IOException { JSONArray students = new JSONArray(); students.add(new Student(1,"Robert")); students.add(new Student(2,"Julia")); StringWriter out = new StringWriter(); students.writeJSONString(out); System.out.println(out.toString()); } } class Student implements JSONStreamAware { int rollNo; String name; Student(int rollNo, String name){ this.rollNo = rollNo; this.name = name; } @Override public void writeJSONString(Writer out) throws IOException { Map obj = new LinkedHashMap(); obj.put("name", name); obj.put("rollNo", new Integer(rollNo)); JSONValue.writeJSONString(obj, out); } }
输出
[{name:"Robert",rollNo:1},{name:"Julia",rollNo:2}]