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的关系可以用如下图表示:

 

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来保存。

参考资料: 

    点击此处


 

 

 

   

 

最近刚开始用json-lib操作json,但遇到一个问题: 先说说为JSONObject添加属性的3个方法的官方解释: public Object put (Object key, Object value): ——将value映射到key下。如果此JSONObject对象之前存在一个value在这个key下,当前的value会替换掉之前的value。 public JSONObject accumulate (String key, Object value): ——累积value到这个key下。这个方法同element()方法类似,特殊的是,如果当前已经存在一个value在这个key下那么一个JSONArray将会存储在这个key下来保存所有累积的value。如果已经存在一个JSONArray,那么当前的value就会添加到这个JSONArray中。 public JSONObject element (String key, Object value): ——将键/值对放到这个JSONObject对象里面。如果当前value为空(null),那么如果这个key存在的话,这个key就会移除掉。如果这个key之前有value值,那么此方法会调用accumulate()方法。 但经过我测试,put 和 accumulate 方法作用与官方描述一致,但对于element方法却有出入,element 的作用与 put 方法一模一样。 上代码: 先测试 put 方法 ``` JSONObject jo = new JSONObject(); jo.put("str" , "123"); System.out.println(jo); //输出:{"str":"123"} ``` ``` JSONObject jo = new JSONObject(); jo.put("str" , "123"); jo.put("str" , "321"); System.out.println(jo); //输出:{"str":"321"} //说明被替换 ``` ``` JSONObject jo = new JSONObject(); jo.put("str" , "123"); jo.put("str" , null); System.out.println(jo); //输出:{} //说明put方法会排斥空元素,这点官方并没有说明 ``` 再测试 accumulate 方法 ``` JSONObject jo = new JSONObject(); jo.accumulate("strs" , null); System.out.println(jo); //输出:{"strs":null} //说明 accumulate 不会移除空元素 //继续 jo.accumulate("strs" , "123"); System.out.println(jo); //输出:{"strs":[null,"123"]} //与官方说明一致 ``` 最后测试下 element 方法 ``` JSONObject jo = new JSONObject(); jo.element("strs", null); System.out.println(jo); //输出:{} //说明会排斥值为null的属性,这点与官方描述和 put 方法一致 ``` ``` JSONObject jo = new JSONObject(); jo.element("strs", "123"); jo.element("strs", "123"); System.out.println(jo); //输出:{"strs":"321"} //这里貌似并没有调用 accumulate 方法,而是和 put 方法如出一辙,都是替换,谁知道为什么? ```
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页
实付 9.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值