Json——JsonElement

轉自http://blog.csdn.net/chunqiuwei/article/details/49160321

該類是一個抽象類,代表着json串的某一個元素。這個元素可以是一個Json(JsonObject)、可以是一個數組(JsonArray)、可以是一個Java的基本類型(JsonPrimitive)、當然也可以爲null(JsonNull);JsonObject,JsonArray,JsonPrimitive,JsonNull都是JsonElement這個抽象類的子類。JsonElement提供了一系列的方法來判斷當前的JsonElement是否是上述子類的一種:比如isJsonObject()用來判斷當前的json元素是否是一個數組類型,它的實現很簡單且這裏巧妙地應用了Java的多態機制:

public boolean isJsonObject() {  
  return this instanceof JsonObject;  
}

同樣的既然有isJsonObject()等這樣的判斷,該類也提供了把當前JsonElement作爲上述子類的一種返回的方法:

    public JsonObject getAsJsonObject() {  
      if (isJsonObject()) {  
        return (JsonObject) this;  
      }  
      throw new IllegalStateException("Not a JSON Object: " + this);  
    }  

JsonObject對象可以看成 name/values的集合,而這寫values就是一個個JsonElement,他們的結構可以用如下圖表示:


JsonPrimitive:

       JsonElement的子類,該類對Java的基本類型及其對應的對象類進行了封裝,並通過setValue方法爲value賦值

private static final Class<?>[] PRIMITIVE_TYPES = { int.class, long.class, short.class,  
    float.class, double.class, byte.class, boolean.class, char.class, Integer.class, Long.class,  
    Short.class, Float.class, Double.class, Byte.class, Boolean.class, Character.class };  
  
private Object value;

需要注意的是對於Character類型的json元素需要特殊處理:

void setValue(Object primitive) {  
    if (primitive instanceof Character) {  
      // convert characters to strings since in JSON, characters are represented as a single  
      // character string  
      char c = ((Character) primitive).charValue();  
      this.value = String.valueOf(c);  
    } else {  
      $Gson$Preconditions.checkArgument(primitive instanceof Number  
              || isPrimitiveOrString(primitive));  
      this.value = primitive;  
    }  
  } 

同時對於傳入的其他json類型通過checkArgumeng進行過濾,如果不是是Number或者String和 PRIMITIVE_TYPES裏的一種的話,就會拋出異常。
private static boolean isPrimitiveOrString(Object target) {  
    if (target instanceof String) {  
      return true;  
    }  
    //在這裏是Java class的一個簡單應用  
    Class<?> classOfPrimitive = target.getClass();  
    for (Class<?> standardPrimitive : PRIMITIVE_TYPES) {  
     //isAssingableFrom方法的作用是判斷classsOfPrimitive是否可以轉換爲standardPrimitive類型  
    if (standardPrimitive.isAssignableFrom(classOfPrimitive)) {  
        return true;  
      }  
    }  
    return false;  
  }
同樣類似JsonElement,該類也提供了判斷某一個json元素是否是某一類型的判斷和把某一json元素作爲某一類型返回的方法: 
public boolean isNumber() {  
  return value instanceof Number;  
}  
  
@Override  
public Number getAsNumber() {  
  return value instanceof String ? new LazilyParsedNumber((String) value) : (Number) value;  
} 

對於Java幾個基本類型用JsonPrimitive類進行了封裝,  還遺漏了一個null的json元素,Gson也對它進行了單獨的處理,就是JsonNull: 

JsonNull:

該類沒什麼可說的,爲不可變類。當然在json中所有的JsonNullObject 調用equals方法判斷的話都是相等的。

JsonArray:

Json的數組包含的其實也是一個個Json串。所以不難猜出JsonArray中用一個集合類源碼中用List<JsonElement>來添加json數組中的每個元素。(詳見源碼,很簡單)

JsonObject:

json對象類,包含了鍵值對,鍵是字符串類型,它的值是一個JsonElement。用 LinkedTreeMap<String, JsonElement> members來保存。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章