众所周知,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,对于...
本着探究 JSON 原理的目的,我将会在这DEMO中实现了一个简单的JSON解析器。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话,在看完本DEMO后,不妨自己动手实现一个 JSON 解析器。
本篇文章将深入探讨如何在C#中对多级JSON进行解析,并通过实际代码示例来阐述其原理。 首先,我们需要了解C#中用于解析JSON的库,最常用的是 Newtonsoft.Json,也被称为Json.NET。这是一个强大的JSON库,提供了丰富...
通过这个示例,你将有机会深入理解JSON解析的原理,学习如何创建自定义的解析类,以及如何在实际项目中有效利用这些工具。无论是`org.json`库的基础操作,还是自定义封装类的高级技巧,都会对你的Android开发工作...
根据提供的标题、描述、标签及部分内容,我们可以提炼出与C#和JSON相关的多个知识点: ### C#中的JSON处理概述 ...然而,对于想要深入了解JSON解析原理的开发者来说,手动编写解析器仍然具有很高的学习价值。
本文将详细探讨Gson库的JSON解析原理及关键组件。 一、Gson核心概念 1. **GsonBuilder**:这是创建Gson实例的主要方式,通过它可以设置各种配置,如日期格式、字段忽略策略等,然后调用`create()`方法生成Gson对象...
在这个名为"JSON-js-master"的压缩包中,我们很可能是找到了一个JavaScript实现的JSON解析和序列化库的源代码。 在JavaScript中,JSON解析是将JSON格式的字符串转换为JavaScript对象的过程,这个过程也称为解码。...
在这个背景下,“基于simd指令集的json解析模块”是一个针对JSON解析优化的技术,由知名性能优化专家lemire开发,利用SIMD指令来加速解析过程。 SIMD技术在JSON解析中的应用主要体现在两个方面:字符匹配和数据提取...
3. **JSON解析**:STM32上的JSON解析代码是项目的核心部分。由于资源限制,通常会选择轻量级的JSON解析库,如TinyJSON或cJSON,将接收到的JSON字符串转化为结构化的数据,以便于操作。这部分代码可能是独立的C文件,...
在本文中,我们将深入探讨JSON解析器的工作原理、其重要性以及如何使用此类工具来理解和操作JSON数据。 首先,让我们了解JSON的基本结构。JSON基于JavaScript语言的一个子集,但它不依赖于任何特定编程语言。一个...
Java实现自己的Json解析器——Json字符串解析原理 根据提取到的字符,转入不同的解析方法中, 例如字符是t,说明值可能是true,只需检查后面三个字符,如果是r、u、e,则可以直接返回true。 字符是f,说明值可能是...
JSON解析工具是帮助开发者将JSON字符串转换成更直观、易于理解的结构,通常以树形视图呈现,便于调试和分析数据。 本资源提供的是一款JSON解析工具,其主要功能是将JSON数据解析并格式化成一个可交互的TreeView。在...
本资料包包含`dom4j`和`fastjson`两个库,分别用于处理XML和JSON解析。 1. **DOM4J**: DOM4J是一个Java库,它提供了全面和强大的XML处理功能。DOM(Document Object Model)是W3C推荐的一种解析XML的标准模型,...
在本篇中,我们将深入探讨如何进行简单的JSON解析,通过一个具体的Demo来帮助理解这一过程。 JSON的基本结构包括对象(object)和数组(array)。对象由键值对组成,用花括号{}包围,键和值之间用冒号分隔,各个...
本主题将详细介绍标题提及的“json解析用到的所有jar包”,以及它们在JSON处理中的作用。 1. **json-lib-2.2.2-jdk15.jar**:这是一个非常流行的JSON库,为Java提供了一种简单的方式来序列化和反序列化JSON对象。它...
尽管现在有许多高级的网络库如`Retrofit`、`Volley`等,但理解基础的`HttpURLConnection`原理和JSON解析,对于提升Android开发能力具有重要意义。同时,这种基础的实现方式也有助于在没有依赖第三方库的情况下快速...
标题中的“VB6解析json类库”指的是一个用于Visual Basic 6(VB6)环境的JSON解析工具。JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式,广泛应用于Web服务和应用程序之间的数据传输。这个类库...
JSON解析库的工作原理通常是这样的:首先,库会接收一个JSON格式的字符串,然后通过解析算法将这个字符串按照JSON的语法规则分解成一个个键值对或数组。这些键值对或数组会被转化为相应的数据结构,如字典、列表或...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也方便机器解析和生成。在移动应用开发中,特别是在Android平台上,使用JSON数据来创建动态、丰富的动画效果是一种常见做法...
JSON格式通常用于服务器向客户端发送数据,例如在AJAX(Asynchronous JavaScript and XML)请求中,实际使用的并不是XML,而是JSON,因为JSON解析和生成的速度更快,且数据体积更小。 **JSON的基本结构:** 1. 对象...