上篇文章主要集中在了使用json-lib來實現JSON字符串和java中的對象的互轉上,忽視了json-lib本身的功能,json-lib中有兩個類比較重要:JSONObject和JSONArray,這兩個類因其名稱不同,所實現的功能也不盡相同,JSONObject處理的是對象格式的({}),JSONArray處理的是數組格式的([]),下面看具體的使用方法。
JSONObject
一、源碼
JSONObject類中有多個重載的element(),此方法是向JSONObject類中存儲數據的方法,通過查看源代碼,發現JSONObject是通過Map實現數據存儲的,看下面的源碼,
private Map properties; /** * Construct an empty JSONObject. */ public JSONObject() { this.properties = new ListOrderedMap(); }
在JSONObject中有Map屬性,此屬性是一個ListOrderMap的對象,element()方法則是向properties中添加數據,因為properties是map,則可以使用操作Map的方法操作properties屬性,JSONObject對properties的操作方式進行了包裝;從源碼中可以發現還有好多重載的get()方法,如,
public Object get( String key ) { verifyIsNull(); return this.properties.get( key ); }
從get方法中可以看出使用的便是Map的get方法。
經過以上的源碼分析,可以知道對JSONObject的操作即是對Map的操作。
二、使用
public static void TestJSONObject(){ //創建一個JSONObject對象 JSONObject jsonObject=new JSONObject(); jsonObject.element("my", "this is my first"); String str=jsonObject.toString(); String keyValue=jsonObject.getString("my"); System.out.println("str:"+str); System.out.println("keyValue:"+keyValue); }
打印結果,
str:{"my":"this is my first"} keyValue:this is my first
有了JSONObject實例之後,使用element()方法把鍵和鍵對應的值添加進去,打印出字符串可以看出是JSON對象的格式,可以看出這種形式和把一個類轉化為JSON格式的字符串是一致的,可以把“my”當做是類的屬性,“this is my first”是屬性的值。
有了這樣的理解之後,可以把一個JSON字符串轉化為一個JSONObjec對象,然後取得對象中的值,如下,
public static void getValue(){ String str="{\"my\":\"this is my first\",\"second\":\"this is second!\"}"; JSONObject jsonObject=JSONObject.fromObject(str); String my=jsonObject.getString("my"); String second=jsonObject.getString("second"); System.out.println("my:"+my); System.out.println("secode:"+second); }
打印結果如下,
my:this is my first secode:this is second!
可以看出我們完全可以不把JSON字符串轉化為相應的類,同樣可以獲得想要的值,如果要轉化為相應的類,必須要有如下的類,
package com.cn.study.day3; public class TestAndMy { private String my; private String second; public String getMy() { return my; } public void setMy(String my) { this.my = my; } public String getSecond() { return second; } public void setSecond(String second) { this.second = second; } }
生成類的代碼如下,
public static void getValue(){ String str="{\"my\":\"this is my first\",\"second\":\"this is second!\"}"; JSONObject jsonObject=JSONObject.fromObject(str); String my=jsonObject.getString("my"); String second=jsonObject.getString("second"); System.out.println("my:"+my); System.out.println("secode:"+second); System.out.println("-------------------------------"); //生成類 TestAndMy test=(TestAndMy)jsonObject.toBean(jsonObject, TestAndMy.class); System.out.println("my:"+test.getMy()+",second:"+test.getSecond()); }
在有些情況下,可能不是這種簡單的字符串,而是比較復雜的,我們應該如何取得想要的值呢,看下面的例子,
public static void complex(){ String str="{\"data\":{\"my\":\"this is my first\",\"second\":\"this is second!\"}}"; JSONObject jsonObject=JSONObject.fromObject(str); JSONObject dataObject=jsonObject.getJSONObject("data"); System.out.println("dd:"+dataObject.toString()); }
打印結果,
dd:{"my":"this is my first","second":"this is second!"}
在上邊的例子中不再是一個JSON對象,而是data對應一個JSON對象,在獲得了JSONObject實例之後,我們知道一個JSONObject實例,其底層存儲是Map的,那麼使用get方法可以獲得其鍵對應的值,可以使用get(String key)方法,此方法返回一個Object對象,返回Object對象之後就不好處理了,此種方法行不通,可以使用getString(String key),此方法是返回key對應的值的字符串形式,那麼針對上邊的例子,我們返回的應該是{"my":"this is my first","second":"this is second!"},還是達不到最終解析的目的。最終發現使用getJSONObject(String key)方法可以,返回的是JSONObject的對象,那麼我們可以接著使用此對象進行完全解析。
JSONArray
一、源碼
查看JSONArray的源碼,可以發現JSONArray的底層是List實現的,即使用JSONArray對象存儲數據是放在List中的,
/** * The List where the JSONArray's properties are kept. */ private List elements; /** * Construct an empty JSONArray. */
public JSONArray() { this.elements = new ArrayList(); }
JSONArray中所有的值都是放在elements中的,elements又是ArrayList的一個實例。ArrayList底層是通過數組實現的。那麼對於JSONArray的操作就是基於數組的。
JSONArray提供了重載的element()方法,用來新增數據,提供了重載的get()方法來取出數據
二、使用
下面是一個使用JSONArray的例子,
public static void testJSONArray(){ String array="[\"123\",\"this is my test\",{\"address\":\"北京市朝陽區\",\"age\":\"23\",\"name\":\"JSON\"}]"; JSONArray jsonArray=JSONArray.fromObject(array); //由於JSONArray底層是數組,所以這裡使用下標的方式來訪問其中的元素 String str1=jsonArray.getString(0); String str2=jsonArray.getString(1); String str3=jsonArray.getString(2); System.out.println("str1:"+str1+",str2:"+str2+",str3:"+str3); //由於第三個元素本身是一個對象形式的JSON串,可以這樣獲得第三個元素 JSONObject o3=jsonArray.getJSONObject(2);//獲得JSONObject對象 System.out.println("address:"+o3.getString("address")+",age:"+o3.getString("age")); }
打印結果為,
str1:123,str2:this is my test,str3:{"address":"北京市朝陽區","age":"23","name":"JSON"} address:北京市朝陽區,age:23
由於JOSNArray是由ArrayList實現的,所有這裡是使用getString()方法,可以獲得每個索引處的字符串,但是無法做到完全解析此字符串的目的,所以可以使用getJSONObject()方法獲得第三個位置的對象,然後解析此對象。
從上邊的敘述中可以JSONArray、JOSNObject兩個類都可以存儲數據,只是使用的方式不同,正是這種不同造成了解析方式不同。
有不正之處,歡迎指出,謝謝!