package Ġcom . by but ter . sis y ph us . dto . jackson Ċ Ċ import Ġcom . by but ter . sis y ph us . dto . Dto Model Ċ import Ġcom . by but ter . sis y ph us . jackson . Json Ċ import Ġcom . by but ter . sis y ph us . jackson . java Type Ċ import Ġcom . by but ter . sis y ph us . reflect . Simple Type Ċ import Ġcom . by but ter . sis y ph us . reflect . to Type Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġcom . fasterxml . jackson . core . Object Codec Ċ import Ġcom . fasterxml . jackson . core . TreeNode Ċ import Ġcom . fasterxml . jackson . databind . Bean Description Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Context Ċ import Ġcom . fasterxml . jackson . databind . Java Type Ċ import Ġcom . fasterxml . jackson . databind . Json Deserializer Ċ Ċ internal Ġclass ĠModel Deserializer < T Ġ: ĠD to Model >( val Ġtarget Class : ĠJava Type ) Ġ: ĠJson Deserializer < T >() Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġp . readValue As Tree < TreeNode >() ĊĠĠĠĠĠĠĠ Ġval Ġtarget Type Ġ= Ġselect Type ( node , Ġctxt ) ĊĠĠĠĠĠĠĠ Ġval Ġbean Description Ġ= Ġctxt . config . int rospect < Bean Description >( target Type ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠD to Model ( target Type . to Canonical (). to Type () Ġas ĠSimple Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeserialize Into ( p . codec , Ġnode , Ġbean Description , Ġthis , Ġctxt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context , Ġinto Value : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode Ġ= ĠJson . deserialize ( p ) ĊĠĠĠĠĠĠĠ Ġval Ġtarget Type Ġ= Ġselect Type ( node , Ġctxt ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target Type . raw Class Ġ!= Ġinto Value . java Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġctxt . readValue ( p , Ġtarget Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġbean Description Ġ= Ġctxt . config . int rospect < Bean Description >( target Type ) ĊĠĠĠĠĠĠĠ Ġreturn Ġdeserialize Into ( p . codec , Ġnode , Ġbean Description , Ġinto Value , Ġctxt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdeserialize Into ( codec : ĠObject Codec , Ġnode : ĠTreeNode , Ġbean Description : ĠBean Description , Ġinto Value : ĠT , Ġctxt : ĠDeserial ization Context ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= Ġbean Description . find Properties (). associate By Ġ{ Ġit . name Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( fieldName Ġin Ġnode . field Names ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Ġ= Ġproperties [ fieldName ] Ġ?: Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparser Ġ= Ġnode . get ( fieldName ). traverse ( codec ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparser . nextToken () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty . setter . call On With ( into Value , Ġctxt . readValue < Any >( parser , Ġproperty . getter . type )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠRuntimeException ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġinto Value ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Type ( node : ĠTreeNode , Ġctxt : ĠDeserial ization Context ): ĠJava Type Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtarget Type Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctxt . readValue < Java Type >( node . get ("\ $ type "). traverse (), ĠJava Type :: class . java . java Type ) Ġ?: Ġtarget Class ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( target Class . is Type Or Super TypeOf ( target Type . raw Class )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget Type ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtarget Class ĊĠĠĠ Ġ} Ċ } Ċ