JsonElement的简单说明
2015-10-17 11:43
639 查看
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来保存。参考资料:
点击此处相关文章推荐
- extjs4.2 隐藏treePanel 的节点
- JS基础知识梳理---location()对象
- Jsoup解析HTML实例及文档方法详解
- 解决:未能加载文件或程序集“Newtonsoft.Json, Version=4.5.0.0
- ExtJs之格式化(Ext.util.Format)
- JS获取系统时间、计算两个日期天数、比较日期大小
- FineReport——JS二次开发(隐藏下拉框控件的倒三角)
- jsoup 简介
- 电话操作-JSON解析-图片下载工具类
- 你不知道的JavaScript--Item7 函数和(命名)函数表达式
- 你不知道的JavaScript--Item7 函数和(命名)函数表达式
- JSP模板
- JS中的random()、floor()、ceil()、round()
- Javascript Arguments对象
- Ember.js 入门指南——model简介2
- Ember.js 入门指南——model简介1
- JS学习笔记(02)——节点对象
- PhantomJS基础及示例
- json格式化
- PhantomJS