`

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,对于...

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

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

    C#对多级json解析

    本篇文章将深入探讨如何在C#中对多级JSON进行解析,并通过实际代码示例来阐述其原理。 首先,我们需要了解C#中用于解析JSON的库,最常用的是 Newtonsoft.Json,也被称为Json.NET。这是一个强大的JSON库,提供了丰富...

    JSON解析demo.zip

    通过这个示例,你将有机会深入理解JSON解析的原理,学习如何创建自定义的解析类,以及如何在实际项目中有效利用这些工具。无论是`org.json`库的基础操作,还是自定义封装类的高级技巧,都会对你的Android开发工作...

    C#_json教程之C#开发json解析类

    根据提供的标题、描述、标签及部分内容,我们可以提炼出与C#和JSON相关的多个知识点: ### C#中的JSON处理概述 ...然而,对于想要深入了解JSON解析原理的开发者来说,手动编写解析器仍然具有很高的学习价值。

    Gson_Json解析源码

    本文将详细探讨Gson库的JSON解析原理及关键组件。 一、Gson核心概念 1. **GsonBuilder**:这是创建Gson实例的主要方式,通过它可以设置各种配置,如日期格式、字段忽略策略等,然后调用`create()`方法生成Gson对象...

    JSON解析和反解析源代码

    在这个名为"JSON-js-master"的压缩包中,我们很可能是找到了一个JavaScript实现的JSON解析和序列化库的源代码。 在JavaScript中,JSON解析是将JSON格式的字符串转换为JavaScript对象的过程,这个过程也称为解码。...

    基于simd指令集的json解析模块

    在这个背景下,“基于simd指令集的json解析模块”是一个针对JSON解析优化的技术,由知名性能优化专家lemire开发,利用SIMD指令来加速解析过程。 SIMD技术在JSON解析中的应用主要体现在两个方面:字符匹配和数据提取...

    Json解析器

    在本文中,我们将深入探讨JSON解析器的工作原理、其重要性以及如何使用此类工具来理解和操作JSON数据。 首先,让我们了解JSON的基本结构。JSON基于JavaScript语言的一个子集,但它不依赖于任何特定编程语言。一个...

    Java实现自己的Json解析器

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

    JSON 解析工具

    JSON解析工具是帮助开发者将JSON字符串转换成更直观、易于理解的结构,通常以树形视图呈现,便于调试和分析数据。 本资源提供的是一款JSON解析工具,其主要功能是将JSON数据解析并格式化成一个可交互的TreeView。在...

    STM32上json协议解析代码

    3. **JSON解析**:STM32上的JSON解析代码是项目的核心部分。由于资源限制,通常会选择轻量级的JSON解析库,如TinyJSON或cJSON,将接收到的JSON字符串转化为结构化的数据,以便于操作。这部分代码可能是独立的C文件,...

    xml解析和json解析.zip

    本资料包包含`dom4j`和`fastjson`两个库,分别用于处理XML和JSON解析。 1. **DOM4J**: DOM4J是一个Java库,它提供了全面和强大的XML处理功能。DOM(Document Object Model)是W3C推荐的一种解析XML的标准模型,...

    简单的JSON解析

    在本篇中,我们将深入探讨如何进行简单的JSON解析,通过一个具体的Demo来帮助理解这一过程。 JSON的基本结构包括对象(object)和数组(array)。对象由键值对组成,用花括号{}包围,键和值之间用冒号分隔,各个...

    json解析用到的所有jar包

    本主题将详细介绍标题提及的“json解析用到的所有jar包”,以及它们在JSON处理中的作用。 1. **json-lib-2.2.2-jdk15.jar**:这是一个非常流行的JSON库,为Java提供了一种简单的方式来序列化和反序列化JSON对象。它...

    Android Http URL Connection获取数据并JSON解析

    尽管现在有许多高级的网络库如`Retrofit`、`Volley`等,但理解基础的`HttpURLConnection`原理和JSON解析,对于提升Android开发能力具有重要意义。同时,这种基础的实现方式也有助于在没有依赖第三方库的情况下快速...

    VB6解析json类库

    标题中的“VB6解析json类库”指的是一个用于Visual Basic 6(VB6)环境的JSON解析工具。JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式,广泛应用于Web服务和应用程序之间的数据传输。这个类库...

    JSON解析库

    JSON解析库的工作原理通常是这样的:首先,库会接收一个JSON格式的字符串,然后通过解析算法将这个字符串按照JSON的语法规则分解成一个个键值对或数组。这些键值对或数组会被转化为相应的数据结构,如字典、列表或...

    解析json进行动画展示

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也方便机器解析和生成。在移动应用开发中,特别是在Android平台上,使用JSON数据来创建动态、丰富的动画效果是一种常见做法...

    json解析与生成

    JSON格式通常用于服务器向客户端发送数据,例如在AJAX(Asynchronous JavaScript and XML)请求中,实际使用的并不是XML,而是JSON,因为JSON解析和生成的速度更快,且数据体积更小。 **JSON的基本结构:** 1. 对象...

Global site tag (gtag.js) - Google Analytics