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 stringchar 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;}@Overridepublic 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来保存。

参考资料:

点击此处

JsonElement的简单说明相关推荐

  1. Android:用GSON 五招之内搞定任何JSON数组

    写在前面原文  http://www.iamxiarui.com/2016/08/30/android:用gson-五招之内搞定任何json数组/ 关于GSON的入门级使用,这里就不提了,如有需要可以 ...

  2. 通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定...

    如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了.我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础.最开始接触 ...

  3. ASP.NET Core和json请求这样用真简单,axios、微信小程序得救了

    本文介绍了一种在ASP.NET Core MVC/ASP.NET Core WebAPI中,将axios等前端提交的json格式请求数据,映射到Action方法的普通类型参数的方法,并且讲解了其实现原 ...

  4. 在docker上安装部署tomcat项目 超简单,拿来主义

    在docker中部署tomcat,非常简单,而且省去了手动安装jdk等步骤,只需要将war包复制在容器tomcat实例中的webapps下面即可.以下将详细讲解流程: 在windows中打好包以后用w ...

  5. Linux下tomcat的安装与卸载以及配置(超简单)

    无敌简单的几步 1.安装 //首先你需要下载好tomcat包 sudo tar -xvzf apache-tomcat-7.0.85.tar.gz(这里是包名) -C 你要放的位置 2.卸载 rm - ...

  6. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  7. Docker的安装、镜像源更换与简单应用

    Docker的安装.镜像源更换与简单应用[阅读时间:约20分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 三.Docker的安装 四.Docker的简单应用 1. ...

  8. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  9. 简单图文配置golang+vscode【win10/centos7+golang helloworld+解决install failed等情况】

    博客目录(阅读时间:10分钟) 一.win10 0.系统环境 1. win10配置golang环境 ①下载相关软件 ②创建gowork工作空间 ③配置环境变量(GOPATH+PATH) ④验证环境配置 ...

  10. 简单介绍互联网领域选择与营销方法

    在我看来,互联网领域的选择是"安家",而营销方法的不同则表现了"定家"的方式多种多样,只有选对了,"家"才得以"安定". ...

最新文章

  1. webdriver中处理alert
  2. C++中数组的赋值方法
  3. torch.where用法
  4. 【Android 逆向】Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )
  5. angularJS(5)
  6. C# 9 新特性:代码生成器、编译时反射
  7. 快速安装Docker图形化管理平台ShipYard
  8. 冒泡排序和选择排序的JAVA程序
  9. java map遍历_Java中Map集合的两种遍历方式
  10. shell学习之突发奇想 ^_^ 打印9*9乘法表
  11. 一致性算法中的节点下限(转)
  12. 如何打开 Excel VBA 及 我的第一个代码
  13. 发那科机器人圆弧指令怎么用_发那科机器人走弧线的指令是什么
  14. php怎么转换bt,php格式的文件转成bt种子文件的方法
  15. 一种解决常见的80/443端口被占用导致steamcommunity 302服务无法启动的方法
  16. 米家电磁炉显示e10_MIJIA 米家 电磁炉
  17. 共享计算机突然无法访问,共享的文件突然不能访问了电脑重启后又能访问为什么...
  18. session的钝化和session的活化(序列化和反序列化)
  19. 【K8S】阿里云VPS内网环境-Kubernetes集群基础部署(CentOS8.2)
  20. mac 下搭建paly framework体验(环境搭建)

热门文章

  1. 重置mysql8.0.16的root密码
  2. RSocket 基于消息传递的反应式应用层网络协议
  3. 算法笔记_面试题_13.二叉树的最近公共祖先
  4. 论文阅读笔记(五)——FD-MOBILENET
  5. 实操教程 | 深度学习pytorch训练代码模板(个人习惯)
  6. 深度学习|三维重建:R-MVSNet
  7. Web前端开发规范 之html命名规范
  8. Mysql添加远程访问权限
  9. 【Golang】如何不反序列化为前提的情况下,修改ProtoBuffer某个Tag的值
  10. 中石油acm4985: Going Dutch 还钱问题(状压dp)