1. 程式人生 > >org.json.simple使用詳解

org.json.simple使用詳解

一、概覽

JSON.simple是一個很簡單的JSON處理,讀取和寫JSON資料的JAVA庫,
它完全相容JSON的標準(RFC4627).
你可以用JSON.simple來編碼或解碼JSON文字。


【NOTE】
如果想將物件轉換成JOSN,或將JSON轉換成物件,你需要考慮使用Jackson或Gson。


二、功能

JSON.simple的功能:
 . 完全相容JSON的標準(RFC4627)
 . 提供了多個功能,如編碼;
 . 使用輕量級的庫來解碼/解析和轉換JSON文字
 . 靈活,簡單並且易於被Map和List介面重用;
 . 支援流式的JSON文字輸出;

 . 提供了對於JSON文字流式輸入的可停止的SAX-like介面;
 . 基於解析器的頭;
 . 高效能;
 . 不依賴其它的庫;
 . 所有的程式碼和執行檔案都和JDK 1.2相容

JSON和Java 例項的對映關係:
|__JSON_______|______Java_________________|
  string                        java.lang.String
  number                     java.lang.Number
  true|false                  java.lang.Boolean

  null                          null
  array                        java.util.List
  object                       java.util.Map

在解碼或解析時,JSON.simple的對映是從左邊對映到右邊;
在編碼時,對映關係是從右邊到左邊;

在解碼時,
預設具體的java.util.List類對應的是 org.json.simple.JSONArray; 
預設具體的java.util.Map類對應的是 org.json.simple.JSONObject; 


在編碼時,
沒有列在表右邊的類需要實現JSONAware或JSONStreamAware(僅用於流)來實現定製化的JSON輸出;
在這種情況下,JSON.simple呼叫JSONAware.toJSONString()或 JSONStreamAware.writeJSONString()
來確定JSON文字的結果;

三、JSON.simple 新增到Maven的pom.xml

JSON.simple is available at Maven central repository, just declares following dependency in your pom.xml file.

<dependency>
    <groupId>com.googlecode.json-simple</groupId>
    <artifactId>json-simple</artifactId>
    <version>1.1</version>
</dependency>

四、 JSON編碼示例

4.1 編碼成JSON物件 

1. Example 1-1 -編碼成一個JSON物件

  //import org.json.simple.JSONObject;

  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("nickname",null);
  System.out.print(obj);


Result: {"balance":1000.21,"num":100,"nickname":null,"is_vip":true,"name":"foo"}


JSONObject is subclass of java.util.HashMap. No ordering is provided. 
If you need strict ordering of elements use JSONValue.toJSONString( map ) 
method with ordered map implementation such as java.util.LinkedHashMap (see example 1-3).
Please refer Mapping Between JSON and Java Entities for more information.
JSONObject是Java.util.HashMap的子類,不提供排序。
如果你需要強制對元素進行排序,可以使用JSONValue.toJSONString(map)方法來實現。


2. Example 1-2 - Encode a JSON object - Streaming

  //import org.json.simple.JSONObject;

  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("nickname",null);


  StringWriter out = new StringWriter();
  obj.writeJSONString(out);
  String jsonText = out.toString();
  System.out.print(jsonText);


Result: {"balance":1000.21,"num":100,"nickname":null,"is_vip":true,"name":"foo"}


JSONObject is subclass of java.util.HashMap. No ordering is provided. 
If you need strict ordering of elements use JSONValue.toJSONString( map ) 
method with ordered map implementation such as java.util.LinkedHashMap (see example 1-3). 
Please refer Mapping Between JSON and Java Entities for more information.


3. Example 1-3 - Encode a JSON object - Using Map

  //import java.util.LinkedHashMap;
  //import java.util.Map;
  //import org.json.simple.JSONValue;

  Map obj=new LinkedHashMap();
  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("nickname",null);
  String jsonText = JSONValue.toJSONString(obj);
  System.out.print(jsonText);


Result: {"name":"foo","num":100,"balance":1000.21,"is_vip":true,"nickname":null}


Now the order of the object entries is preserved, which is different from example 1-1. 
Please refer Mapping Between JSON and Java Entities for more information.


4. Example 1-4 - Encode a JSON object - Using Map and streaming

  //import java.util.LinkedHashMap;
  //import java.util.Map;
  //import org.json.simple.JSONValue;

   Map obj=new LinkedHashMap();
   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("nickname",null);


   StringWriter out = new StringWriter();
   JSONValue.writeJSONString(obj, out);
   String jsonText = out.toString();
   System.out.print(jsonText);


Result: {"name":"foo","num":100,"balance":1000.21,"is_vip":true,"nickname":null}


Please refer Mapping Between JSON and Java Entities for more information.


4.2 編碼成JSON陣列

1. Example 2-1 - Encode a JSON array

  //import org.json.simple.JSONArray;

  JSONArray list = new JSONArray();
  list.add("foo");
  list.add(new Integer(100));
  list.add(new Double(1000.21));
  list.add(new Boolean(true));
  list.add(null);
  System.out.print(list);


Result: ["foo",100,1000.21,true,null]


2. Example 2-2 - Encode a JSON array - Streaming

  //import org.json.simple.JSONArray;

  JSONArray list = new JSONArray();
  list.add("foo");
  list.add(new Integer(100));
  list.add(new Double(1000.21));
  list.add(new Boolean(true));
  list.add(null);


  StringWriter out = new StringWriter();
  list.writeJSONString(out);
  String jsonText = out.toString();
  System.out.print(jsonText);


Result: ["foo",100,1000.21,true,null]
Please refer Mapping Between JSON and Java Entities for more information.


3. Example 2-3 - Encode a JSON array - Using List

  //import org.json.simple.JSONValue;

  LinkedList list = new LinkedList();
  list.add("foo");
  list.add(new Integer(100));
  list.add(new Double(1000.21));
  list.add(new Boolean(true));
  list.add(null);


  String jsonText = JSONValue.toJSONString(list);
  System.out.print(jsonText);


Result: ["foo",100,1000.21,true,null]
Please refer Mapping Between JSON and Java Entities for more information.


4. Example 2-4 - Encode a JSON array - Using List and streaming

  //import org.json.simple.JSONValue;


  LinkedList list = new LinkedList();
  list.add("foo");
  list.add(new Integer(100));
  list.add(new Double(1000.21));
  list.add(new Boolean(true));
  list.add(null);


  StringWriter out = new StringWriter();
  JSONValue.writeJSONString(list, out);
  String jsonText = out.toString();
  System.out.print(jsonText);


Result: ["foo",100,1000.21,true,null]


Please refer Mapping Between JSON and Java Entities for more information.


4.3 合併兩個JSON物件

Example 3 - Merge two JSON objects

  //import org.json.simple.JSONObject;

  JSONObject obj1 = new JSONObject();
  obj1.put("name","foo");
  obj1.put("num",new Integer(100));
  obj1.put("balance",new Double(1000.21));

  JSONObject obj2 = new JSONObject();
  obj2.put("is_vip",new Boolean(true));
  obj2.put("nickname",null);


  obj2.putAll(obj1);


  System.out.print(obj2);
Result: {"balance":1000.21,"num":100,"nickname":null,"is_vip":true,"name":"foo"}, 
the same as the one of Example 1.


4.4 合併兩個JSON陣列

Example 4 - Merge two JSON arrays

  JSONArray list1 = new JSONArray();
  list1.add("foo");
  list1.add(new Integer(100));
  list1.add(new Double(1000.21));

  JSONArray list2 = new JSONArray();
  list2.add(new Boolean(true));
  list2.add(null);


  list2.addAll(list1);


  System.out.print(list2);


Result: [true,null,"foo",100,1000.21], the order of which is different from the one of Example 2.


4.5 原始JSON聯結

Example 5-1 - Combination of JSON primitives, JSON object and JSON arrays

  JSONArray list1 = new JSONArray();
  list1.add("foo");
  list1.add(new Integer(100));
  list1.add(new Double(1000.21));

  JSONArray list2 = new JSONArray();
  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("nickname",null);

  obj.put("list1", list1);
  obj.put("list2", list2);

  System.out.println(obj);
Result: {"balance":1000.21,"list2":[true,null],"num":100,"list1":["foo",100,1000.21],"nickname":null,"is_vip":true,"name":"foo"}


Example 5-2 - Combination of JSON primitives, Map and List

  Map m1 = new LinkedHashMap();
  Map m2 = new HashMap();
  List  l1 = new LinkedList();


  m1.put("k11","v11");
  m1.put("k12","v12");
  m1.put("k13", "v13");
  m2.put("k21","v21");
  m2.put("k22","v22");
  m2.put("k23","v23");
  l1.add(m1);
  l1.add(m2);


  String jsonString = JSONValue.toJSONString(l1);

  System.out.println(jsonString);
Result: [{"k11":"v11","k12":"v12","k13":"v13"},{"k22":"v22","k21":"v21","k23":"v23"}]


Example 5-3 - Combination of JSON primitives, JSONObject, Map and List, and streaming

  StringWriter out = new StringWriter();

  JSONObject obj = new JSONObject();
  LinkedHashMap m1 = new LinkedHashMap();
  LinkedList l1 = new LinkedList();
  obj.put("k1", "v1");
  obj.put("k2", m1);
  obj.put("k3", l1);
  m1.put("mk1", "mv1");
  l1.add("lv1");
  l1.add("lv2");
  m1.put("mk2", l1);

  obj.writeJSONString(out);
  System.out.println("jsonString:");
  System.out.println(out.toString());
  String jsonString = obj.toJSONString();
  System.out.println(jsonString);
Result:
  jsonString:
  {"k3":["lv1","lv2"],"k1":"v1","k2":{"mk1":"mv1","mk2":["lv1","lv2"]}}
  {"k3":["lv1","lv2"],"k1":"v1","k2":{"mk1":"mv1","mk2":["lv1","lv2"]}}


4.6 定製化的JSON輸出

Example 6-1 - Customize JSON outputs

/*class User implements JSONAware{
        private int id;
        private String name;
        private String password;

        public User(int id, String name, String password){