程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> json-lib的使用《二》,json-lib《二》

json-lib的使用《二》,json-lib《二》

編輯:JAVA綜合教程

json-lib的使用《二》,json-lib《二》


上篇文章主要集中在了使用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兩個類都可以存儲數據,只是使用的方式不同,正是這種不同造成了解析方式不同。

有不正之處,歡迎指出,謝謝!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved