天天看點

JsonElement的簡單說明

JsonElement:

該類是一個抽象類,代表着json串的某一個元素。這個元素可以是一個Json(JsonObject)、可以是一個數組(JsonArray)、可以是一個Java的基本類型(JsonPrimitive)、當然也可以為null(JsonNull);JsonObject,JsonArray,JsonPrimitive,JsonNull都是JsonElement這個抽象類的子類。JsonElement提供了一系列的方法來判斷目前的JsonElement

是否是上述子類的一種:比如isJsonObject()用來判斷目前的json元素是否是一個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);
  }
           

各個JsonElement的關系可以用如下圖表示:

JsonElement的簡單說明

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

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來儲存。

參考資料: 

    點選此處

繼續閱讀