Gson中JsonElement的简单说明

JsonElement:

该类是一个抽象类,代表着json串的某一个元素。这个元素可以是一个Json(JsonObject)、可以是一个数组(JsonArray)、可以是一个Java的基本类型(JsonPrimitive)、当然也可以为null(JsonNull);JsonObject,JsonArray,JsonPrimitive,JsonNull都是JsonElement这个抽象类的子类。JsonElement提供了一系列的方法来判断当前的JsonElement

是否是上述子类的一种:比如isJsonObject()用来判断当前的json元素是否是一个数组类型,它的实现很简单且这里巧妙地应用了Java的多态机制:

[java]  view plain  copy
  1. public boolean isJsonObject() {  
  2.   return this instanceof JsonObject;  
  3. }  

同样的既然有isJsonObject()等这样的判断,该类也提供了把当前JsonElement作为上述子类的一种返回的方法:

[java]  view plain  copy
  1. public JsonObject getAsJsonObject() {  
  2.   if (isJsonObject()) {  
  3.     return (JsonObject) this;  
  4.   }  
  5.   throw new IllegalStateException("Not a JSON Object: " + this);  
  6. }  

各个JsonElement的关系可以用如下图表示:


JsonObject对象可以看成 name/values的集合,而这写values就是一个个JsonElement,他们的结构可以用如下图表示:

以上图片来源见文章底部的参考资料!


JsonPrimitive:

       JsonElement的子类,该类对Java的基本类型及其对应的对象类进行了封装,并通过setValue方法为value赋值

    

[java]  view plain  copy
  1. private static final Class<?>[] PRIMITIVE_TYPES = { int.classlong.classshort.class,  
  2.     float.classdouble.classbyte.classboolean.classchar.class, Integer.class, Long.class,  
  3.     Short.class, Float.class, Double.class, Byte.class, Boolean.class, Character.class };  
  4.   
  5. private Object value;  
需要注意的是对于Character类型的json元素需要特殊处理:

[java]  view plain  copy
  1. void setValue(Object primitive) {  
  2.     if (primitive instanceof Character) {  
  3.       // convert characters to strings since in JSON, characters are represented as a single  
  4.       // character string  
  5.       char c = ((Character) primitive).charValue();  
  6.       this.value = String.valueOf(c);  
  7.     } else {  
  8.       $Gson$Preconditions.checkArgument(primitive instanceof Number  
  9.               || isPrimitiveOrString(primitive));  
  10.       this.value = primitive;  
  11.     }  
  12.   }  
同时对于传入的其他json类型通过checkArgumeng进行过滤,如果不是是Number或者String和 PRIMITIVE_TYPES里的一种的话,就会抛出异常。

[java]  view plain  copy
  1. private static boolean isPrimitiveOrString(Object target) {  
  2.     if (target instanceof String) {  
  3.       return true;  
  4.     }  
  5.     //在这里是Java class的一个简单应用  
  6.     Class<?> classOfPrimitive = target.getClass();  
  7.     for (Class<?> standardPrimitive : PRIMITIVE_TYPES) {  
  8.      //isAssingableFrom方法的作用是判断classsOfPrimitive是否可以转换为standardPrimitive类型  
  9.     if (standardPrimitive.isAssignableFrom(classOfPrimitive)) {  
  10.         return true;  
  11.       }  
  12.     }  
  13.     return false;  
  14.   }  
同样类似JsonElement,该类也提供了判断某一个json元素是否是某一类型的判断和把某一json元素作为某一类型返回的方法:

[java]  view plain  copy
  1. public boolean isNumber() {  
  2.   return value instanceof Number;  
  3. }  
  4.   
  5. @Override  
  6. public Number getAsNumber() {  
  7.   return value instanceof String ? new LazilyParsedNumber((String) value) : (Number) value;  
  8. }  
对于Java几个基本类型用JsonPrimitive类进行了封装,  还遗漏了一个null的json元素,Gson也对它进行了单独的处理,就是JsonNull:

JsonNull:

该类没什么可说的,为不可变类。当然在json中所有的JsonNullObject 调用equals方法判断的话都是相等的。

JsonArray:

Json的数组包含的其实也是一个个Json串。所以不难猜出JsonArray中用一个集合类源码中用List<JsonElement>来添加json数组中的每个元素。(详见源码,很简单)

JsonObject:

json对象类,包含了键值对,键是字符串类型,它的值是一个JsonElement。用 LinkedTreeMap<String, JsonElement> members来保存。

参考资料: 

    点击此处


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值