jsonobject的fromobject函数底层详解
作为一种常用的数据传输格式,JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,易于人类阅读和编写,同时也易于机器解析和生成。在Java语言中,我们可以使用JsonObject类来处理JSON数据,其中fromObject()方法是JsonObject类中一个重要的静态函数,具备将java对象转为json对象的功能。底层原理有以下3点:
1. 利用反射获取Java对象的成员变量
在fromObject()方法的实现中,首先做的就是利用Java反射机制来获取Java对象的成员变量。JsonObject中通过getDeclaredFields()方法获取一个类所有的成员变量。另外,如果需要序列化的Java对象中成员变量的可见性不是public的话,还需要使用setAccessible(true)方法打破Java中成员变量的封装性限制,让我们能够访问红的部分。
2. 利用简单工厂模式创建JsonObject
接下来,我们再来看看JsonObject中的 fromObject() 方法内部核心代码:
```
public static JsonObject fromObject(Object obj) {
JsonObject jsonObject = new JsonObject();
json转换对象jsonObject.putAll(new BeanMap(obj));
return jsonObject;
}
```
这段代码中,我们可以看到fromObject()方法首先创建了一个JsonObject对象,并调用了 BeanMap 对象的 putAll() 方法,将 Java 对象封装成 JSON 格式。这其中,BeanMap 是一个开源工具类,实现了将 Java 对象转为一个 Map 对象的功能,因此我们可以利用这个类来实现JSON化。
3. 通过递归处理子元素
对于Java对象中的复杂数据类型(比如List、Map等),JsonObject fromObject() 方法依旧采用递归处理的方式。递归逻辑图示:
对象 -> JsonObject
/ | \
int bool string -> JsonPrimitive
/ \
Map List -> JsonObject[]
在递归处理过程中,JSONObject fromObject() 方法通过判断目标对象是否为集合、Map、数组等复杂类型,分支调用不同的方法处理子元素:
1. 如果目标对象是数组,那么继续调用 fromArray() 方法,遍历处理其中的每个元素并添加到 JsonObject 中去。
2. 如果目标对象是 Map 类型,那么继续运用反射机制,将 Map 中的所有 K/V 对封装成 JsonObject,并以 K 为 key,JsonObject 为 value,添加到当前的 JsonObject 对象中去。
3. 如果目标对象是集合类型,那么就对其进行遍历,并递归对里面的元素调用 fromObject() 方法,将其转为 JsonObject[] 数组,再将数组封装成 JsonArray 对象,并添加到 JsonObject 中去。
4. 如果当前目标对象是基本数据类型或者 String 类型,那么就将其转为 JsonPrimitive 并添加到 JsonObject 中去。
综上所述,JsonObject fromObject() 方法底层原理其实就是利用了Java反射机制,利用简单工厂模式创建 JsonObject 对象,并通过递归处理子元素,最终完成将 Java 对象转换成 Json 对象的过程。因此,在使用该方法时,我们需要注意一些细节,如Java对象的封装性、继承等问题,保持代码的可维护性和扩展性。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论