众所周知,json格式的字符串,有很多公用包可以做到,那具体怎么做的呢?
其实猜也可以猜到,大概是通过类Class的反射,获取每个属性,然后输出成响应格式的文本,来看看fastjson-1.2.4具体实现:
public static final String toJSONString(Object object) { return toJSONString(object, new SerializerFeature[0]); } public static final String toJSONString(Object object, SerializerFeature... features) { SerializeWriter out = new SerializeWriter(); try { JSONSerializer serializer = new JSONSerializer(out); for (com.alibaba.fastjson.serializer.SerializerFeature feature : features) { serializer.config(feature, true); } serializer.write(object); return out.toString(); } finally { out.close(); } }
public final void write(Object object) { if (object == null) { out.writeNull(); return; } Class<?> clazz = object.getClass(); ObjectSerializer writer = getObjectWriter(clazz); try { writer.write(this, object, null, null, 0); } catch (IOException e) { throw new JSONException(e.getMessage(), e); } }
public ObjectSerializer getObjectWriter(Class<?> clazz) { ObjectSerializer writer = get(clazz); if (writer == null) { try { final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); for (Object o : ServiceLoader.load(AutowiredObjectSerializer.class, classLoader)) { if (!(o instanceof AutowiredObjectSerializer)) { continue; } AutowiredObjectSerializer autowired = (AutowiredObjectSerializer) o; for (Type forType : autowired.getAutowiredFor()) { put(forType, autowired); } } } catch (ClassCastException ex) { // skip } writer = get(clazz); } if (writer == null) { final ClassLoader classLoader = JSON.class.getClassLoader(); if (classLoader != Thread.currentThread().getContextClassLoader()) { try { for (Object o : ServiceLoader.load(AutowiredObjectSerializer.class, classLoader)) { if (!(o instanceof AutowiredObjectSerializer)) { continue; } AutowiredObjectSerializer autowired = (AutowiredObjectSerializer) o; for (Type forType : autowired.getAutowiredFor()) { put(forType, autowired); } } } catch (ClassCastException ex) { // skip } writer = get(clazz); } } if (writer == null) { if (Map.class.isAssignableFrom(clazz)) { put(clazz, MapSerializer.instance); } else if (List.class.isAssignableFrom(clazz)) { put(clazz, ListSerializer.instance); } else if (Collection.class.isAssignableFrom(clazz)) { put(clazz, CollectionSerializer.instance); } else if (Date.class.isAssignableFrom(clazz)) { put(clazz, DateSerializer.instance); } else if (JSONAware.class.isAssignableFrom(clazz)) { put(clazz, JSONAwareSerializer.instance); } else if (JSONSerializable.class.isAssignableFrom(clazz)) { put(clazz, JSONSerializableSerializer.instance); } else if (JSONStreamAware.class.isAssignableFrom(clazz)) { put(clazz, JSONStreamAwareSerializer.instance); } else if (clazz.isEnum() || (clazz.getSuperclass() != null && clazz.getSuperclass().isEnum())) { put(clazz, EnumSerializer.instance); } else if (clazz.isArray()) { Class<?> componentType = clazz.getComponentType(); ObjectSerializer compObjectSerializer = getObjectWriter(componentType); put(clazz, new ArraySerializer(componentType, compObjectSerializer)); } else if (Throwable.class.isAssignableFrom(clazz)) { put(clazz, new ExceptionSerializer(clazz)); } else if (TimeZone.class.isAssignableFrom(clazz)) { put(clazz, TimeZoneCodec.instance); } else if (Appendable.class.isAssignableFrom(clazz)) { put(clazz, AppendableSerializer.instance); } else if (Charset.class.isAssignableFrom(clazz)) { put(clazz, CharsetCodec.instance); } else if (Enumeration.class.isAssignableFrom(clazz)) { put(clazz, EnumerationSeriliazer.instance); } else if (Calendar.class.isAssignableFrom(clazz)) { put(clazz, CalendarCodec.instance); } else if (Clob.class.isAssignableFrom(clazz)) { put(clazz, ClobSeriliazer.instance); } else { boolean isCglibProxy = false; boolean isJavassistProxy = false; for (Class<?> item : clazz.getInterfaces()) { if (item.getName().equals("net.sf.cglib.proxy.Factory") || item.getName().equals("org.springframework.cglib.proxy.Factory")) { isCglibProxy = true; break; } else if (item.getName().equals("javassist.util.proxy.ProxyObject")) { isJavassistProxy = true; break; } } if (isCglibProxy || isJavassistProxy) { Class<?> superClazz = clazz.getSuperclass(); ObjectSerializer superWriter = getObjectWriter(superClazz); put(clazz, superWriter); return superWriter; } if (Proxy.isProxyClass(clazz)) { put(clazz, createJavaBeanSerializer(clazz)); } else { put(clazz, createJavaBeanSerializer(clazz)); } } writer = get(clazz); } return writer; }
看到这里就差不多明白了,就是根据其不同类型,拿到具体的ObjectSerializer子类,来做不同的输入操作。
相关推荐
完成json 基本结构(键值对、对象、数组、字符串)的解析, 完成对true、false、null、整数的解析, 完成浮点数的解析; 完成科学计数法表示的数的解析; 完成json 文本的格式化。添加一个命令行参数-pretty,对于...
C#对多级json解析,非常实用,此代码写在load事件里面,然后可以了解解析json的原理。尤其是多级解析。
本着探究 JSON 原理的目的,我将会在这DEMO中实现了一个简单的JSON解析器。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话,在看完本DEMO后,不妨自己动手实现一个 JSON 解析器。
Java实现自己的Json解析器——Json字符串解析原理 根据提取到的字符,转入不同的解析方法中, 例如字符是t,说明值可能是true,只需检查后面三个字符,如果是r、u、e,则可以直接返回true。 字符是f,说明值可能是...
原理:用时创建的规则降低传统解析器一次性将文本转成Java对象而占用大量内存空间,通过注册Filter并判断自己关注的KEY/VALUE来有选择的创建Java对象或JsonLazyer子对象。 使用方法可以查看jar包中的Sample.java示例...
简单 清除 讲解android json 解析原理
一、JSON格式介绍 ...本着探究 JSON 原理的目的,我将会在这篇文章中详细向大家介绍一个简单的JSON解析器的解析流程和实现细节。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话
jsonpath 用于多层嵌套 json格式的 解析。 pip install jsonpath JsonPath 描述 $ 根节点 @ 现行节点 .or[] 取子节点 n/a 取父节点,jsonpath为支持 .. 就是不管位置,选择所有复合条件的条件 * ...
基本原理JSON解析器不仅解析JSON,而且还提供使用它的API。解析后,您必须遍历其数组,在对象中查找值,并最终提取字符串,浮点数等。 JSON基准通常仅测量解析器读取JSON文件所花费的时间。即使对于将JSON读取到树中...
学习SpringMVC处理JSON数据的具体实现和基本原理,同时会使用HttpMessageConverter
jackson框架解析json,主要讲解了怎样解析Bean,List,Map,Bean>,List,Bean>>类型的json
无损-json 解析 JSON 而不会有丢失数字信息的风险。 let text = '{"normal":2.3,"long":123456789012345678901,"big":2.3e+500}' ;// JSON.parse will lose some digits and a whole number:console . log ( JSON . ...
MSX JSON解析器 一个小型库,用于在MSX BASIC下解析JSON文件。 基本原理 MSX有很多可用的网络墨盒。 您可能希望使用它们连接到我们周围的许多REST端点,但大多数仅以JSON进行通信。 该库提供了JSON解析功能来填补这...
1.json与jsonp的引入 在ajax中 JSON用来解决数据交换问题,而JSONP来实现跨域。 备注:跨域也可以通过服务器端代理来解决; 理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方...
主要介绍了Python Json数据文件操作原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
JSON 比 XML 更小、更快,更易解析。 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,...
Go的替代JSON解析器(到目前为止最快)它不需要您知道有效负载的结构(例如,创建结构),并且允许通过提供指向它们的路径来访问字段。 它比sta Go的sta Alternative JSON解析器快10倍(迄今为止最快)。它不需要您...
主要介绍了基于java解析JSON的三种方式,结合实例形式详细分析了json解析的原理与GSON、FastJSON等常用解析操作技巧,需要的朋友可以参考下
主要介绍了JsonFormat与@DateTimeFormat注解实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了java JSON解析库Alibaba Fastjson用法,结合实例形式详细分析了java JSON解析库Alibaba Fastjson的基本功能、原理、用法及操作注意事项,需要的朋友可以参考下