天天看點

gson 2.7 學習筆記gson 2.7 學習筆記

gson 2.7 學習筆記

概述

  • 參考
    • http://www.jianshu.com/p/e740196225a4

GsonBuilder—->入口

  • com.google.gson.GsonBuilder.create—->利用serializeNulls、類型擴充卡、FieldNamingPolicy等政策建立gson

Gson—->主要操作類

  • typeTokenCache—->用于存放以類型資訊為key的類型擴充卡緩存
  • factories—->建立json時添加一系列類型擴充卡工廠,例如STRING_FACTORY/ReflectiveTypeAdapterFactory
  • com.google.gson.Gson.toJson(java.lang.Object, java.lang.reflect.Type, com.google.gson.stream.JsonWriter)
    • ((TypeAdapter) adapter).write(writer, src)
      • com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.BoundField.write—->将pojo的值利用反射寫入JsonWriter
      • 利用TypeAdapter将T寫入到JsonWriter
    • com.google.gson.Gson.fromJson(com.google.gson.stream.JsonReader, java.lang.reflect.Type)
      • object = typeAdapter.read(reader)
        • com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.BoundField.read—->pojo對象利用反射注入值
        • com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.Adapter.read
      • 利用typeAdapter将JsonReader的内容轉為T

JsonElement—->json元素

  • JsonObject
    • members—->包含name-value pairs JsonElement
    • 提供建立擷取元素
  • JsonArray
    • elements—->數組元素支援
    • 添加、擷取、疊代元素
  • JsonPrimitive
    • 8種基本類型與封裝類型支援
  • JsonNull
    • null對象支援

TypeAdapter—->類型擴充卡

  • 從JsonReader讀取字元流轉為T,将T利用JsonWriter轉為字元流
  • TypeAdapters—->提供基本類型的類型擴充卡,例如BOOLEAN、BYTE、LONG等類型擴充卡
  • ReflectiveTypeAdapterFactory—->TypeAdapterFactory
  • com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.Adapter
    • com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.BoundField—->反射解析出來的字段資訊
    • 利用注解轉換Java中普通的POJO
  • FieldNamingPolicy—->FieldNamingStrategy
    • 将字段名稱按照政策進行轉換,例如字段名稱、首字母大寫、小寫下劃線

JsonWriter/JsonReader—->json流支援

  • com.google.gson.stream.JsonWriter.value(java.lang.String)—->寫字段值
  • com.google.gson.stream.JsonReader.nextString—->讀取字段值

JsonToken—->json的辨別符

注解支援—->SerializedName/Expose/JsonAdapter

  • SerializedName用于支援序列化與反序列化的字段名稱,會覆寫FieldNamingStrategy
  • Expose用于表示字段是否應該序列化與反序列化
  • JsonAdapter以注解的方式支援TypeAdapter

TypeToken—->對java泛型擦除的補充

  • 記錄原生類型與參數化類型資訊

測試

  • 示例代碼位于– https://github.com/undergrowthlinear/2016MyBookSummary.git
  • com.undergrowth.google.gson.GsonDemo.main
  • com.undergrowth.google.gson.writer.JsonWriterDemo.main
  • com.undergrowth.google.gson.jsonadapter.UserJsonAdapter.main
  • 詳細講解toJson與fromJson資料流
    • gson.toJson/fromJson
    • com.google.gson.Gson.toJson(java.lang.Object, java.lang.reflect.Type, com.google.gson.stream.JsonWriter)
      • com.google.gson.Gson.getAdapter(com.google.gson.reflect.TypeToken)—->查找擴充卡
      • candidate = factory.create(this, type)—->利用初始化的擴充卡工廠建立擴充卡
        • com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create—->對于POJO,調用此方法
        • com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.Adapter.Adapter
        • 利用此read/wirte利用JsonWriter/JsonReader将T與json之間進行轉換