加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

JsonElement的简单说明

发布时间:2020-12-16 19:03:22 所属栏目:百科 来源:网络整理
导读:JsonElement: 该类是一个抽象类,代表着json串的某一个元素。这个元素可以是一个Json(JsonObject)、可以是一个数组(JsonArray)、可以是一个Java的基本类型(JsonPrimitive)、当然也可以为null(JsonNull);JsonObject,JsonArray,JsonPrimitive,JsonNull都是Js

JsonElement:

该类是一个抽象类,代表着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);
  }

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

参考资料:

点击此处

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读