package Ġcom . github . d re ip ol . d re id roid . serialization Ċ Ċ import Ġcom . google . gson .* Ċ import Ġcom . google . gson . annotations . SerializedName Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġcom . google . gson . stream . Json Reader Ċ import Ġcom . google . gson . stream . Json Writer Ċ import Ġjava . io . IOException Ċ Ċ /** Ċ Ġ* ĠEnables Ġprocessing Ġhooks Ġwhile Ġparsing Ġwith ĠG SON . Ċ Ġ* Ċ Ġ* ĠExample : ĠExtract ing Ġlogo Url Ġand Ġmail Text Ġfrom Ġa Ġwrapped Ġ" header " ĠJSON Ġattribute Ġduring Ġde serialization Ċ Ġ* Ġ``` Ċ Ġ* Ġopen Ġclass ĠMy Model Ġ{ Ċ Ġ* ĠĠĠĠ Ġvar Ġid : ĠInt Ġ= Ġ 0 Ċ Ġ* ĠĠĠĠ Ġvar Ġarticles : ĠRealm List < Article Preview > Ġ= ĠRealm List () Ċ Ġ* ĠĠĠĠ Ġvar Ġlogo Url : ĠString ? Ġ= Ġ"" Ċ Ġ* ĠĠĠĠ Ġvar Ġmail Text : ĠString ? Ġ= Ġ"" Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġclass ĠTransformer Ġ: ĠJson Transform Type Adapter Factory < My Model >( My Model :: class . java ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġafter Read ( tree : ĠJson Element ?) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tree Ġ== Ġnull ) Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠjsonObject Ġ= Ġtree . as JsonObject Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject [" header "] ?. let Ġ{ Ġheader Ġ-> Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Object Ġ= Ġheader . as JsonObject Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Object ?. let Ġ{ Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject . add (" logo Url ", Ġheader Object [" logo "]) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject . add (" mail Text ", Ġheader Object [" mail Text "]) Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠĠĠĠĠ Ġ} Ċ Ġ* ĠĠĠĠ Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ``` Ċ Ġ* ĠThe ĠType Adapter Ġneeds Ġto Ġbe Ġadded Ġto Ġthe Ġgson Ġde serializer Ġduring Ġinitialization : Ċ Ġ* Ġ``` Ċ Ġ* Ġprivate Ġvar Ġgson : ĠGson Ġ= ĠGson Builder () Ċ Ġ* ĠĠĠĠ Ġ. register Type Adapter Factory ( My Model . Transformer ()) Ċ Ġ* ĠĠĠĠ Ġ. create () Ċ Ġ* Ġ``` Ċ Ġ*/ Ċ public Ġabstract Ġclass ĠJson Transform Type Adapter Factory < C >( private Ġval Ġm Class : ĠClass < C >) Ġ: ĠType Adapter Factory Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġcreate ( gson : ĠGson , Ġtype : ĠType Token < T >): ĠType Adapter < T >? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( type . raw Type Ġ== Ġm Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ( wrapped Adapter ( gson , Ġtype Ġas ĠType Token < C >) Ġas ĠType Adapter < T >) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġopen Ġfun Ġafter De Serialization ( c : ĠC ) Ġ{} ĊĠĠĠ Ġpublic Ġopen Ġfun Ġafter Read ( tree : ĠJson Element ?) Ġ{} ĊĠĠĠ Ġpublic Ġopen Ġfun Ġhas Object ( jsonObject : ĠJsonObject , Ġfield : ĠString ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠjsonObject . has ( field ) Ġ&& ĠjsonObject [ field ]. is JsonObject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġopen Ġfun Ġbefore Serialization ( value : ĠC ): ĠC Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġopen Ġfun Ġbefore Write ( element : ĠJson Element ) Ġ{} ĊĠĠĠ Ġprivate Ġfun Ġwrapped Adapter ( gson : ĠGson , Ġtype : ĠType Token < C >): ĠType Adapter < C > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelegate Ġ= Ġgson . get Delegate Adapter ( this , Ġtype ) ĊĠĠĠĠĠĠĠ Ġval Ġelement Adapter Ġ= Ġgson . get Adapter ( Json Element :: class . java ) ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Ġ: ĠType Adapter < C >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġwrite ( out : ĠJson Writer , Ġvalue : ĠC ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠnewValue Ġ= Ġbefore Serialization ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġdelegate . toJson Tree ( newValue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbefore Write ( element ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Adapter . write ( out , Ġelement ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread ( input : ĠJson Reader ): ĠC Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtree Ġ= Ġelement Adapter . read ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter Read ( tree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc Ġ= Ġdelegate . fromJson Tree ( tree ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġafter De Serialization ( c ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġc ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }