/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 . Ġfan poll ĠAll Ġrights Ġreserved . Ċ Ġ*/ Ċ package Ġfan poll . infra . base . json Ċ Ċ import Ġcom . fasterxml . jackson . annotation . JsonInclude Ċ import Ġcom . fasterxml . jackson . core . Json Generator Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġcom . fasterxml . jackson . databind .* Ċ import Ġcom . fasterxml . jackson . databind . module . Simple Module Ċ import Ġcom . fasterxml . jackson . databind . node . Array Node Ċ import Ġcom . fasterxml . jackson . databind . node . Object Node Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġfan poll . infra . base . exception . Internal Server Exception Ċ import Ġfan poll . infra . base . i 1 8 n . Lang Ċ import Ġfan poll . infra . base . response . Inf ra Response Code Ċ import Ġfan poll . infra . base . util . DateTime Utils Ċ import Ġjava . io . InputStream Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . Round ingMode Ċ import Ġjava . time .* Ċ import Ġjava . util .* Ċ Ċ object ĠJack son Ġ{ ĊĊĠĠĠ Ġ// Ġhttps :// github . com / F aster XML / jackson - module - kotlin ĊĠĠĠ Ġval Ġmapper : ĠObjectMapper Ġ= Ġj ack son ObjectMapper () ĊĠĠĠĠĠĠĠ Ġ. configure ( Serialization Feature . WRITE _ DAT ES _ AS _ TIMESTAMP S , Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ. enable ( Deserialization Feature . USE _ BIG _ DECIMAL _ FOR _ FLOAT S ) ĊĠĠĠĠĠĠĠ Ġ. disable ( Deserialization Feature . FAIL _ ON _ UNKNOWN _ PROPERTIES ) ĊĠĠĠĠĠĠĠ Ġ. disable ( Deserialization Feature . ADJ UST _ DAT ES _ TO _ CONTEXT _ TIME _ ZONE ) ĊĠĠĠĠĠĠĠ Ġ. set Serialization In clusion ( JsonInclude . Include . NON _ NULL ) ĊĠĠĠĠĠĠĠ Ġ. register Module ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Module () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( UUID :: class . java , ĠUUID Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( UUID :: class . java , ĠUUID De Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( Zone Id :: class . java , ĠZone Id Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( Zone Id :: class . java , ĠZone Id De Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( Instant :: class . java , ĠInstant Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( Instant :: class . java , ĠInstant De Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( Z onedDateTime :: class . java , ĠZ onedDateTime Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( Z onedDateTime :: class . java , ĠZ onedDateTime De Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( LocalDateTime :: class . java , ĠLocalDateTime Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( LocalDateTime :: class . java , ĠLocalDateTime De Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( LocalDate :: class . java , ĠLocalDate Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( LocalDate :: class . java , ĠLocalDate De Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( Local Time :: class . java , ĠLocal Time Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( Local Time :: class . java , ĠLocal Time De Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( BigDecimal :: class . java , ĠBigDecimal Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( BigDecimal :: class . java , ĠBigDecimal De Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Serializer ( Lang :: class . java , ĠLang Serializer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Deserializer ( Lang :: class . java , ĠLang De Serializer ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠ Ġfun ĠtoJson ( data : ĠAny ): ĠJsonNode Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . value To Tree ( data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInternal Server Exception ( Inf ra Response Code . DEV _ ERROR , Ġ" fail Ġto Ġjson Ġserialize ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠtoJson String ( data : ĠAny ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġstringify ( toJson ( data )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnew Object (): ĠObject Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmapper . createObject Node () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġnew Array (): ĠArray Node Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmapper . create Array Node () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġstringify ( json : ĠJsonNode ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġmapper . writeValue AsString ( json ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse ( src : ĠString ): ĠJsonNode Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . read Tree ( src ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Exception (" fail Ġto Ġparse Ġjson ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse ( src : ĠInputStream ): ĠJsonNode Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . read Tree ( src ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Exception (" fail Ġto Ġparse Ġjson ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġparse ( src : ĠByteArray ): ĠJsonNode Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . read Tree ( src ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Exception (" fail Ġto Ġparse Ġjson ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠLang Serializer Ġ: ĠJsonSerializer < Lang >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠLang ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . writeString ( value . code ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠLang De Serializer Ġ: ĠJson Deserializer < Lang >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠLang Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLang ( p . text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠUUID Serializer Ġ: ĠJsonSerializer < UUID >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠUUID ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . writeString ( value . toString ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠUUID De Serializer Ġ: ĠJson Deserializer < UUID >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠUUID Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠUUID . fromString ( p . text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠZone Id Serializer Ġ: ĠJsonSerializer < Zone Id >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠZone Id ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . writeString ( value . id ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠZone Id De Serializer Ġ: ĠJson Deserializer < Zone Id >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠZone Id Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠZone Id . of ( p . text ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠInstant Serializer Ġ: ĠJsonSerializer < Instant >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠInstant ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . writeString ( DateTime Utils . UTC _ DATE _ TIME _ FORMAT TER . format ( value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠInstant De Serializer Ġ: ĠJson Deserializer < Instant >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠInstant Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠZ onedDateTime . parse ( p . text , ĠDateTime Utils . UTC _ DATE _ TIME _ FORMAT TER ). to Instant () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠZ onedDateTime Serializer Ġ: ĠJsonSerializer < Z onedDateTime >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠZ onedDateTime ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . writeString ( DateTime Utils . UTC _ DATE _ TIME _ FORMAT TER . format ( value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠZ onedDateTime De Serializer Ġ: ĠJson Deserializer < Z onedDateTime >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠZ onedDateTime Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠZ onedDateTime . parse ( p . text , ĠDateTime Utils . UTC _ DATE _ TIME _ FORMAT TER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠLocalDateTime Serializer Ġ: ĠJsonSerializer < LocalDateTime >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠLocalDateTime ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . writeString ( DateTime Utils . LOCAL _ DATE _ TIME _ FORMAT TER . format ( value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠLocalDateTime De Serializer Ġ: ĠJson Deserializer < LocalDateTime >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠLocalDateTime Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLocalDateTime . parse ( p . text , ĠDateTime Utils . LOCAL _ DATE _ TIME _ FORMAT TER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠLocalDate Serializer Ġ: ĠJsonSerializer < LocalDate >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠLocalDate ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . writeString ( DateTime Utils . LOCAL _ DATE _ FORMAT TER . format ( value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠLocalDate De Serializer Ġ: ĠJson Deserializer < LocalDate >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠLocalDate Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLocalDate . parse ( p . text , ĠDateTime Utils . LOCAL _ DATE _ FORMAT TER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠLocal Time Serializer Ġ: ĠJsonSerializer < Local Time >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠLocal Time ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . writeString ( DateTime Utils . LOCAL _ TIME _ FORMAT TER . format ( value )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠLocal Time De Serializer Ġ: ĠJson Deserializer < Local Time >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠLocal Time Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠLocal Time . parse ( p . text , ĠDateTime Utils . LOCAL _ TIME _ FORMAT TER ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġconst Ġval ĠDEFAULT _ SCALE Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġval ĠDEFAULT _ ROUND ING _ MODE Ġ= ĠRound ingMode . UP ĊĊĠĠĠ Ġprivate Ġobject ĠBigDecimal Serializer Ġ: ĠJsonSerializer < BigDecimal >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( value : ĠBigDecimal ?, Ġgen : ĠJson Generator , Ġserializers : ĠSerializer Provider ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġgen . write Number ( value . set Scale ( DEFAULT _ SCALE , ĠDEFAULT _ ROUND ING _ MODE ). toDouble ()) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġobject ĠBigDecimal De Serializer Ġ: ĠJson Deserializer < BigDecimal >() Ġ{ ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( p : ĠJson Parser , Ġctxt : ĠDeserial ization Context ?): ĠBigDecimal Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġp . decimal Value . set Scale ( DEFAULT _ SCALE , ĠDEFAULT _ ROUND ING _ MODE ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ // fun ĠAny . toJson String (): ĠString Ġ= Ġmapper . writeValue AsString ( this ) Ċ // Ċ // fun ĠAny . toJson Node (): ĠJsonNode Ġ= Ġmapper . convert Value ( this , ĠJsonNode :: class . java ) Ċ // Ċ // fun ĠString . toJson Node (): ĠJsonNode Ġ= Ġmapper . read Tree ( this ) Ċ // Ċ // fun ĠString . json ToMap (): ĠMap < String , Ġ*> Ġ= Ġmapper . readValue ( this , Ġobject Ġ: ĠType Reference < Map < String , Ġ* >>() Ġ{}) Ċ Ċ // fun Ġ< T > ĠString . json ToObject ( clazz : ĠClass < T >): ĠT Ġ= Ġmapper . readValue ( this , Ġclazz ) Ċ // Ċ // fun Ġ< T > ĠString . json ToList (): ĠList < T > Ġ= Ġmapper . readValue ( this , Ġobject Ġ: ĠType Reference < List < T >>() Ġ{}) Ċ Ċ // fun Ġ< T > ĠTreeNode . toObject ( clazz : ĠClass < T >): ĠT Ġ= Ġmapper . tree To Value ( this , Ġclazz ) ĊĊĊ