`

json解析的原理

阅读更多

众所周知,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子类,来做不同的输入操作。

0
0
分享到:
评论

相关推荐

    编译原理json解析器

    完成json 基本结构(键值对、对象、数组、字符串)的解析, 完成对true、false、null、整数的解析, 完成浮点数的解析; 完成科学计数法表示的数的解析; 完成json 文本的格式化。添加一个命令行参数-pretty,对于...

    C#对多级json解析

    C#对多级json解析,非常实用,此代码写在load事件里面,然后可以了解解析json的原理。尤其是多级解析。

    自己实现一个简单的JSON解析器

    本着探究 JSON 原理的目的,我将会在这DEMO中实现了一个简单的JSON解析器。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话,在看完本DEMO后,不妨自己动手实现一个 JSON 解析器。

    Java实现自己的Json解析器

    Java实现自己的Json解析器——Json字符串解析原理 根据提取到的字符,转入不同的解析方法中, 例如字符是t,说明值可能是true,只需检查后面三个字符,如果是r、u、e,则可以直接返回true。 字符是f,说明值可能是...

    Java解析JSON文本,大数据量工具包

    原理:用时创建的规则降低传统解析器一次性将文本转成Java对象而占用大量内存空间,通过注册Filter并判断自己关注的KEY/VALUE来有选择的创建Java对象或JsonLazyer子对象。 使用方法可以查看jar包中的Sample.java示例...

    Android JSON网络数据交换_基本应用样例

    简单 清除 讲解android json 解析原理

    c# 如何实现一个简单的json解析器

    一、JSON格式介绍 ...本着探究 JSON 原理的目的,我将会在这篇文章中详细向大家介绍一个简单的JSON解析器的解析流程和实现细节。由于 JSON 本身比较简单,解析起来也并不复杂。所以如果大家感兴趣的话

    Python json解析库jsonpath原理及使用示例

    jsonpath 用于多层嵌套 json格式的 解析。 pip install jsonpath JsonPath 描述 $ 根节点 @ 现行节点 .or[] 取子节点 n/a 取父节点,jsonpath为支持 .. 就是不管位置,选择所有复合条件的条件 * ...

    json_benchmark_results:许多JSON解析器的广泛基准测试结果(及其图表)

    基本原理JSON解析器不仅解析JSON,而且还提供使用它的API。解析后,您必须遍历其数组,在对象中查找值,并最终提取字符串,浮点数等。 JSON基准通常仅测量解析器读取JSON文件所花费的时间。即使对于将JSON读取到树中...

    SpringMVC-9 处理JSON数据

    学习SpringMVC处理JSON数据的具体实现和基本原理,同时会使用HttpMessageConverter

    jackson框架解析json

    jackson框架解析json,主要讲解了怎样解析Bean,List,Map,Bean&gt;,List,Bean&gt;&gt;类型的json

    lossless-json:解析 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 . ...

    msxjson:用于MSX BASIC的JSON解析器

    MSX JSON解析器 一个小型库,用于在MSX BASIC下解析JSON文件。 基本原理 MSX有很多可用的网络墨盒。 您可能希望使用它们连接到我们周围的许多REST端点,但大多数仅以JSON进行通信。 该库提供了JSON解析功能来填补这...

    通过实例解析json与jsonp原理及使用方法

    1.json与jsonp的引入 在ajax中 JSON用来解决数据交换问题,而JSONP来实现跨域。 备注:跨域也可以通过服务器端代理来解决; 理解:JSON是一种数据交换格式,而JSONP是一种依靠开发人员的聪明才智创造出的一种非官方...

    Python Json数据文件操作原理解析

    主要介绍了Python Json数据文件操作原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    json原理分析及实例介绍

    JSON 比 XML 更小、更快,更易解析。 和 XML 一样,JSON 也是基于纯文本的数据格式。由于 JSON 天生是为 JavaScript 准备的,因此,JSON 的数据格式非常简单,您可以用 JSON 传输一个简单的 String,Number,...

    Go的不需要模式的替代JSON解析器(到目前为止最快)-Golang开发

    Go的替代JSON解析器(到目前为止最快)它不需要您知道有效负载的结构(例如,创建结构),并且允许通过提供指向它们的路径来访问字段。 它比sta Go的sta Alternative JSON解析器快10倍(迄今为止最快)。它不需要您...

    基于java解析JSON的三种方式详解

    主要介绍了基于java解析JSON的三种方式,结合实例形式详细分析了json解析的原理与GSON、FastJSON等常用解析操作技巧,需要的朋友可以参考下

    JsonFormat与@DateTimeFormat注解实例解析

    主要介绍了JsonFormat与@DateTimeFormat注解实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java JSON解析库Alibaba Fastjson用法详解

    主要介绍了java JSON解析库Alibaba Fastjson用法,结合实例形式详细分析了java JSON解析库Alibaba Fastjson的基本功能、原理、用法及操作注意事项,需要的朋友可以参考下

Global site tag (gtag.js) - Google Analytics