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.JSONArrayjava.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}]
广告