什麼是json?一種輕量級的數據交換格式,具有良好的可讀和便於快速編寫的特性。
前面幾章講到了xml的解析和生成,本章講解下json的解析和生成
首先我們看下json和xml的異同處
1.JSON和XML的數據可讀性基本相同
2.JSON和XML同樣擁有豐富的解析手段
3.JSON相對於XML來講,數據的體積小
4.JSON與JavaScript的交互更加方便
5.JSON對數據的描述性比XML較差
6.JSON的速度要遠遠快於XML
JSON解析類可以分爲以下幾個類
JSONObject:可以看作是一個json對象,這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(External: 應用toString()方法輸出的數值)調用的響應體現爲一個標準的字符串(例如:{"JSON": "Hello, World"},最外被大括號包裹,其中的Key和Value被冒號":"分隔)。其對於內部(Internal)行爲的操作格式略微,例如:初始化一個JSONObject實例,引用內部的put()方法添加數值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之間是以逗號","分隔。Value的類型包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object 。
JSONStringer:json文本構建類 ,根據官方的解釋,這個類可以幫助快速和便捷的創建JSON text。其最大的優點在於可以減少由於 格式的錯誤導致程序異常,引用這個類可以自動嚴格按照JSON語法規則(syntax rules)創建JSON text。每個 JSONStringer實體只能對應創建一個JSON text。。其最大的優點在於可以減少由於格式的錯誤導致程序異常,引用這個類可以自動嚴格按照JSON語法規則(syntax rules)創建JSON text。每個JSONStringer實體只能對應創建一個JSON text。
JSONArray:它代表一組有序的數值。將其轉換爲String輸出(toString)所表現的形式是用方括號包裹,數值以逗號”,”分隔(例如: [value1,value2,value3],大家可以親自利用簡短的代碼更加直觀的瞭解其格式)。這個類的內部同樣具有查詢行爲, get()和opt()兩種方法都可以通過index索引返回指定的數值,put()方法用來添加或者替換數值。同樣這個類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object。
JSONTokener:json解析類
JSONException:json中用到的異常
一、構建json
首先 我們來構建一個下面的簡單的json
- /**
- * 生成json
- * */
- public String createJson() {
- // TODO Auto-generated method stub
- try {
- JSONObject jsonObject = new JSONObject();
- jsonObject.put("id", "1");
- jsonObject.put("name", "李磊");
- jsonObject.put("age", "30");
- return jsonObject.toString();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return "";
- }
得到的json數據爲:{"id":"1","name":"李磊","age":"30"}
這應該算是最簡單的一個json數據
實現的流程就是新建一個jsonobject對象,通過put將屬性添加到json
接下來 我們來創建一個帶有數組的json數據
- /**
- * 生成json
- * */
- public String createJson() {
- // TODO Auto-generated method stub
- List<Person> persons = getTestValues();
- try {
- JSONObject jsonObject = new JSONObject();
- JSONArray array = new JSONArray();
- for (int i = 0; i < persons.size(); i++) {
- JSONObject person = new JSONObject();
- Person p = persons.get(i);
- person.put("id", p.getId());
- person.put("name", p.getName());
- person.put("age", p.getAge());
- array.put(person);
- }
- jsonObject.put("persons", array);
- System.out.println(jsonObject.toString());
- return jsonObject.toString();
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return "";
- }
上面的代碼 我們得到的是這樣的數據
{"persons":[{"id":"1","age":"30","name":"李磊"},{"id":"2","age":"25","name":"韓梅梅"}]}
看了代碼之後就會發現 代碼很容易理解
1.創建最外層的{}對象jsonObject 2.創建數組對象 用來保存兩個人的信息 3.在循環內創建jsonObject對象 用來保存每個人的信息,別忘了添加完屬性之後 將對象添加到數組 4.將數組添加到最外層對象 |
我們除了使用jsonObject和jsonArray來創建json之外 我們還可以使用JSONStringer
- /**
- * 生成json
- * */
- public String createJson() {
- // TODO Auto-generated method stub
- JSONStringer jsonStringer = new JSONStringer();
- try {
- jsonStringer.object();
- jsonStringer.key("id").value("1");
- jsonStringer.key("name").value("李磊");
- jsonStringer.key("age").value("30");
- jsonStringer.endObject();
- System.out.println(jsonStringer.toString());
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return jsonStringer.toString();
- }
上面的代碼 我們得到了這樣的數據{"id":"1","name":"李磊","age":"30"}
和第一次獲取的一塊 接下來 我們講下大概
1. 首先 新建JSONStringer對象 2. 調用object()方法 說明開始創建 添加了頭{(當然,要和endobject成對出現) 3. 添加一個屬性 通過key("name") 添加了屬性了名稱 通過value("value") 添加了屬性的值 4. 添加完所有內容之後,調用endobject()方法通知json創建完畢 |
好了 接下來我們使用JSONStringer創建一個帶有數組的json數據
- /**
- * 生成json
- * */
- public String createJson() {
- // TODO Auto-generated method stub
- List<Person> persons = getTestValues();
- JSONStringer jsonStringer = new JSONStringer();
- try {
- jsonStringer.object();
- jsonStringer.key("persons");
- jsonStringer.array();
- for (int i = 0; i < persons.size(); i++) {
- Person person = persons.get(i);
- jsonStringer.object();
- jsonStringer.key("id").value(person.getId());
- jsonStringer.key("name").value(person.getName());
- jsonStringer.key("age").value(person.getAge());
- jsonStringer.endObject();
- }
- jsonStringer.endArray();
- jsonStringer.endObject();
- System.out.println(jsonStringer.toString());
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return jsonStringer.toString();
- }
看下生成的字符串
{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韓梅梅","age":"25"}]}
是我們需要的數據
1.創建一個新的JSONStringer對象 用來存儲生成的json數據 2.首先調用key("persons") 添加數組的key值 3.調用array()通知系統 接下來的是一個數組 (和endarray()一起出現) 4.在循環內部通過object()方法 創建一對{} 然後將屬性添加到大括號內 |
上面的代碼我們講了怎麼去生成json數據
二、解析JSON
接下來我們來解析一個最簡單的json數據 數據爲{"id":"1","name":"李磊","age":"30"}
我們來看下解析的代碼
- /**
- * 解析json
- * */
- public Person parserJson() {
- // TODO Auto-generated method stub
- String json = "{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"}";
- Person person = new Person();
- try {
- JSONTokener jsonTokener = new JSONTokener(json);
- // 此時還未讀取任何json文本,直接讀取就是一個JSONObject對象。
- // 如果此時的讀取位置在"name" : 了,那麼nextValue就是"李磊"(String)
- JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
- person.setId(jsonObject.getString("id"));
- person.setName(jsonObject.getString("name"));
- person.setAge(jsonObject.getString("age"));
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return person;
- }
我們解析的步驟
1.將json字符串轉換爲jsonTokener對象 2.調用jsonTokener的nextValue()方法 將json數據轉換爲jsonObject對象 3.通過getString(keyname)獲取需要的值 |
當然 nextValue()獲取的不一定是jsonObject對象,詳細解釋看代碼註釋
接下來 我們要來解析這樣的數據,帶有數組哦~
{"persons":[{"id":"1","name":"李磊","age":"30"},{"id":"2","name":"韓梅梅","age":"25"}]}
不難 上代碼
- public List<Person> parserJson() {
- // TODO Auto-generated method stub
- String json = "{\"persons\":[{\"id\":\"1\",\"name\":\"李磊\",\"age\":\"30\"},{\"id\":\"2\",\"name\":\"韓梅梅\",\"age\":\"25\"}]}";
- List<Person> persons = new ArrayList<Person>();
- try {
- JSONTokener jsonTokener = new JSONTokener(json);
- // 此時還未讀取任何json文本,直接讀取就是一個JSONObject對象。
- // 如果此時的讀取位置在"name" : 了,那麼nextValue就是"李磊"(String)
- JSONObject jsonObject = (JSONObject) jsonTokener.nextValue();
- JSONArray array = jsonObject.getJSONArray("persons");
- for (int i = 0; i < array.length(); i++) {
- JSONObject object = array.getJSONObject(i);
- Person person = new Person();
- person.setId(object.getString("id"));
- person.setName(object.getString("name"));
- person.setAge(object.getString("age"));
- persons.add(person);
- }
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return persons;
- }
同樣的 我們來解釋下代碼
1.創建一個list 用來存儲解析的信息 2.將json字符串轉換爲jsonTokener對象,再轉換爲jsonObject對象 3.通過getJSONArray("persons")獲取json數組 4.通過循環來解析json數組,解析的內容不解釋,上面已經說過 |
本章內容講解結束