json解析原理

json解析原理之Gson

目标:了解json对象解析的大概过程


alt text

在这个序列化和反序列化的过程中,Gson充当的了一个解析器的角色。

第一阶段:了解Gson数据类型及其关系


  • 第一:JsonElement(超级父类) 看JsonElement类的源码

    • 抽象类
    • 代表json串的某一个元素
    • 某一个元素:
      • JsonObject
      • JsonArray
      • JsonPrimitive(基本类型)
      • JsonNull
  • 第二:JsonElement的四个子类 看JsonElement类的源码

    • JsonObject、JsonArray、JsonPrimitive、JsonNull
    • JsonElement提供了一系列的方法来判断当前的JsonElement属于哪个子类
      • isJsonArray()
      • isJsonObject()
      • isJsonPrimitive()
      • isJsonNull()
    • 同时,该类也提供了把当前JsonElement作为上述子类的一种返回的方法
      • getAsJsonArray()
      • getAsJsonObject()
      • getAsJsonNull()
      • getAsJsonPrimitive();
  • 第三:JsonPrimitive 看JsonPrimitive类的源码
    JsonElement的子类,该类对Java的基本类型及其对应的对象类进行了封装
    Java的基本数据类型(短整长,单精双精,字符<表示为单字符字符串>,布尔)
    • isBoolean()
    • isNumber():包含短整长,单双精,字节
    • isPrimitiveOrString():包含字符和字符串
  • 第四:JsonArray,JsonPrimitive,JsonNull
    很常见的json对象

第二阶段:Gson对象的产生


  • Gson对象的产生
    • 通过new Gson()方式
       使用的都是默认的配置
    • 通过JsonBuilder的方式
       自定义一些配置选项,版本支持,输出,定制序列化、反序列化和构造器等。
      • 建造者模式:设计者模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

alt text

  • 通过new Gson()方式产生
    通过这种方式创建的Gson对象,将用Java的反射机制来完成json的解析
    调用无参构造方法时,会默认调用有参构造方法,将大量默认的TypeAdapterFactory添加到factories中,生成默认的Gson对象

  • 通过GsonBuilder方式产生
    通过这种方式产生的Gson对象,将使用自定义的TypeAdapter来完成json的解析
    TypeAdapter:该类的作用就是把json串封装成你指定的Java对象

    • 通过GsonBuilder注册TypeAdapter,并把TypeAdapter封装成TypeAdpterFactory对象
    • 将封装成的TypeAdapterFactory通过GsonBuilder的create传入Gson对象中并返回
    • 调用gson.fromJson方法,调用getTypeAdapter方法返回你自定义的Adapter
  • 判断Gson对象是那种方式产生的
    通过遍历factories得到里面的TypeAdapterFactory
    添加到factories(list)中的顺序为先添加自定义的TypeAdapterFactory,再添加系统自带的TypeAdapterFactory
    只要得到一个不为空就返回,这样就可以得到自定义的TypeAdapterFactory。


第三阶段:通过反射将json对象转化成java对象

alt text

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值