/* Ċ Ġ* ĠThe ĠMIT ĠLicense Ċ Ġ* Ċ Ġ* ĠCopyright Ġ 2 0 2 1 Ġw kg c ass Ġ( https :// github . com / w kg c ass ) Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ package Ġv json . de serializer Ċ Ċ import Ġv json . JSON Ċ import Ġv json . de serializer . rule .* Ċ import Ġv json . ex . Json ParseException Ċ import Ġv json . listener . Abstract Parser Listener Ċ import Ġv json . parser . Array Parser Ċ import Ġv json . parser . Object Parser Ċ import Ġv json . simple . Simple Null Ċ import Ġv json . util . Cast Utils . cast Ċ import Ġv json . util . collection . Stack Ċ Ċ class ĠDeserialize Parser Listener < T >( rule : ĠRule < T >) Ġ: ĠAbstract Parser Listener () Ġ{ ĊĠ Ġprivate Ġval Ġparse Stack Ġ= ĠStack < Parse Context >() ĊĠ Ġprivate Ġval Ġnext Rule Stack Ġ= ĠStack < Rule <* >>() ĊĠ Ġprivate Ġvar Ġbegin Ġ= Ġfalse ĊĠ Ġprivate Ġvar Ġlast Object : ĠAny ? Ġ= Ġnull ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġrequire (!( rule Ġ! is ĠObject Rule < *> Ġ&& Ġrule Ġ! is ĠArray Rule < *, Ġ*> Ġ&& Ġrule Ġ! is ĠType Rule < *> )) Ġ{ ĊĠĠĠĠĠ Ġ" can Ġonly Ġaccept ĠObject Rule Ġor ĠArray Rule Ġor ĠType Rule " ĊĠĠĠ Ġ} ĊĠĠĠ Ġnext Rule Stack . push ( rule ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Object Begin ( obj : ĠObject Parser ) Ġ{ ĊĠĠĠ Ġval Ġrule Ġ= Ġnext Rule Stack . peek () ĊĠĠĠ Ġif Ġ( rule Ġis ĠType Rule <* >) Ġ{ ĊĠĠĠĠĠ Ġparse Stack . push ( Parse Context ( rule , Ġnull )) ĊĠĠĠ Ġ} Ġelse Ġif Ġ( rule Ġ! is ĠObject Rule <* >) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠJson ParseException (" expect : Ġarray , Ġactual : Ġobject ") ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġparse Stack . push ( Parse Context ( rule , Ġrule . construct ())) ĊĠĠĠ Ġ} ĊĠĠĠ Ġbegin Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġapply Object Rule ForType Rule ( or ule : ĠObject Rule < *> ): ĠParse Context Ġ{ ĊĠĠĠ Ġparse Stack . pop () ĊĠĠĠ Ġval Ġnew Ctx Ġ= ĠParse Context ( or ule , Ġor ule . construct ()) ĊĠĠĠ Ġparse Stack . push ( new Ctx ) ĊĠĠĠ Ġreturn Ġnew Ctx ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Object Key ( obj : ĠObject Parser , Ġkey : ĠString ) Ġ{ ĊĠĠĠ Ġvar Ġctx Ġ= Ġparse Stack . peek () ĊĊĠĠĠ Ġif Ġ( ctx . rule Ġis ĠType Rule <* >) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( key Ġ== Ġ"@ type ") Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ Ġ// Ġwill Ġuse Ġ@ type Ġto Ġdeserialize Ġthe Ġrest Ġk / v ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ// Ġnothing Ġfound , Ġtry Ġto Ġuse Ġdefault Ġrule ĊĠĠĠĠĠ Ġval Ġor ule Ġ= Ġcast < Type Rule < *> >( ctx . rule ). default Rule ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠJson ParseException (" cannot Ġdetermine Ġtype Ġfor Ġ" Ġ+ Ġctx . rule ) ĊĠĠĠĠĠ Ġ// Ġuse Ġthe Ġdefault Ġrule ĊĠĠĠĠĠ Ġctx Ġ= Ġapply Object Rule ForType Rule ( or ule ) ĊĠĠĠĠĠ Ġ// Ġfall Ġthrough ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrule Ġ= Ġcast < Object Rule < *> >( ctx . rule ) ĊĠĠĠ Ġval Ġfield Ġ= Ġrule . get Rule ( key ) ĊĠĠĠĠĠ Ġ?: Ġreturn Ġ Ġ// Ġignore Ġif Ġthe Ġfield Ġis Ġnot Ġregistered ĊĠĠĠ Ġnext Rule Stack . push ( field . rule ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġoperator Ġfun Ġset ( rule : ĠRule <* >, Ġholder : ĠAny , Ġset : Ġ( Any , ĠAny ?) Ġ-> ĠUnit , Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠ Ġif Ġ( value Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( rule Ġis ĠNullable String Rule Ġ|| Ġrule Ġis ĠArray Rule < *, Ġ*> Ġ|| Ġrule Ġis ĠObject Rule <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( holder , Ġnull ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( value Ġis ĠBoolean ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( rule Ġis ĠBool Rule ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( holder , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( rule Ġis ĠDouble Rule Ġ&& Ġvalue Ġis ĠNumber ) Ġ{ ĊĠĠĠĠĠ Ġset ( holder , Ġvalue . toDouble ()) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ġelse Ġif Ġ( rule Ġis ĠLong Rule Ġ&& Ġvalue Ġis ĠNumber ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( value Ġis ĠLong Ġ|| Ġvalue Ġis ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( holder , Ġvalue . to Long ()) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( rule Ġis ĠInt Rule Ġ&& Ġvalue Ġis ĠNumber ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( value Ġis ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( holder , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġif Ġ( value Ġis ĠString ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( rule Ġis ĠString Rule Ġ|| Ġrule Ġis ĠNullable String Rule ) Ġ{ ĊĠĠĠĠĠĠĠ Ġset ( holder , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġ// Ġassert Ġrule Ġinstanceof ĠArray Rule Ġ|| Ġrule Ġinstanceof ĠObject Rule ĊĠĠĠĠĠ Ġset ( holder , Ġvalue ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġthrow ĠJson ParseException ( ĊĠĠĠĠĠ Ġ" invalid Ġtype : Ġexpecting : Ġ" Ġ+ Ġrule Ġ+ Ġ", Ġvalue =" Ġ+ Ġvalue Ġ+ Ġ"(" Ġ+ Ġ( if Ġ( value Ġ== Ġnull ) Ġ" nil " Ġelse Ġvalue :: class . qualified Name ) Ġ+ Ġ")" ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Object Value ( obj : ĠObject Parser , Ġkey : ĠString , Ġvalue : ĠJSON . Instance <* >) Ġ{ ĊĠĠĠ Ġval Ġctx Ġ= Ġparse Stack . peek () ĊĊĠĠĠ Ġif Ġ( ctx . rule Ġis ĠType Rule <* >) Ġ{ ĊĠĠĠĠĠ Ġ// Ġassert Ġkey . equals ("@ type "); ĊĠĠĠĠĠ Ġif Ġ( last Object Ġ! is ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠJson ParseException (" invalid Ġtype : Ġexpecting Ġtype Ġname Ġfor Ġ" Ġ+ Ġctx . rule Ġ+ Ġ" Ġbut Ġgot Ġ" Ġ+ Ġlast Object ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġval Ġtype Ġ= Ġcast < String >( last Object ) ĊĠĠĠĠĠ Ġval Ġor ule Ġ= Ġctx . rule . get Rule ( type ) ĊĠĠĠĠĠĠĠ Ġ?: Ġ// Ġrule Ġnot Ġfound ĊĠĠĠĠĠĠĠ Ġthrow ĠJson ParseException (" cannot Ġfind Ġtype Ġ" Ġ+ Ġtype Ġ+ Ġ" Ġin Ġ" Ġ+ Ġctx . rule ) ĊĠĠĠĠĠ Ġapply Object Rule ForType Rule ( or ule ) ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġrule Ġ= Ġcast < Object Rule < *> >( ctx . rule ) ĊĠĠĠ Ġval Ġfield Ġ= Ġrule . get Rule ( key ) ĊĠĠĠ Ġif Ġ( field Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġ// Ġhandle Ġextra ĊĠĠĠĠĠ Ġfor Ġ( f Ġin Ġrule . extra Rules ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcast <( Any , ĠString , ĠAny ?) Ġ-> ĠUnit >( f )( ctx .` object ` !! , Ġkey , Ġlast Object ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġset ( field . rule , Ġctx .` object ` !! , Ġcast ( field . set ), Ġlast Object ) ĊĠĠĠ Ġnext Rule Stack . pop () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Object Value Java Object ( obj : ĠObject Parser , Ġkey : ĠString , Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠ Ġon Object Value ( obj , Ġkey , ĠSimple Null . Null ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Object End ( obj : ĠObject Parser ) Ġ{ ĊĠĠĠ Ġval Ġctx Ġ= Ġparse Stack . pop () ĊĠĠĠ Ġif Ġ( ctx . rule Ġis ĠType Rule <* >) Ġ{ ĊĠĠĠĠĠ Ġval Ġor ule Ġ= Ġctx . rule . default Rule ĊĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠJson ParseException (" type Ġfor Ġ" Ġ+ Ġctx . rule Ġ+ Ġ" Ġis Ġstill Ġnot Ġdetermined Ġwhen Ġre aching Ġthe Ġobject Ġend ") ĊĠĠĠĠĠ Ġ// Ġuse Ġthe Ġdefault Ġrule Ġto Ġconstruct Ġan Ġempty Ġobject ĊĠĠĠĠĠ Ġval Ġconstructed Ġ= Ġor ule . construct () ĊĠĠĠĠĠ Ġthis . last Object Ġ= Ġor ule . build ( construct ed ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġval Ġlast Object Ġ= Ġctx .` object ` ĊĠĠĠĠĠ Ġthis . last Object Ġ= Ġcast < Object Rule < *> >( ctx . rule ). build ( cast ( last Object )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Array Begin ( array : ĠArray Parser ) Ġ{ ĊĠĠĠ Ġval Ġrule Ġ= Ġnext Rule Stack . peek () ĊĠĠĠ Ġif Ġ( rule Ġ! is ĠArray Rule < *, Ġ* >) Ġ{ ĊĠĠĠĠĠ Ġthrow ĠJson ParseException (" expect : Ġobject , Ġactual : Ġarray ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġparse Stack . push ( Parse Context ( rule , Ġrule . construct ())) ĊĠĠĠ Ġnext Rule Stack . push ( rule . element Rule ) ĊĠĠĠ Ġbegin Ġ= Ġtrue ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Array Value ( array : ĠArray Parser , Ġvalue : ĠJSON . Instance <* >) Ġ{ ĊĠĠĠ Ġval Ġctx Ġ= Ġparse Stack . peek () ĊĠĠĠ Ġval Ġrule Ġ= Ġcast < Array Rule < Any , ĠAny ?> >( ctx . rule ) ĊĠĠĠ Ġset ( rule . element Rule , Ġctx .` object ` !! , Ġrule . add , Ġlast Object ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Array Value Java Object ( array : ĠArray Parser , Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠ Ġon Array Value ( array , ĠSimple Null . Null ) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Array End ( array : ĠArray Parser ) Ġ{ ĊĠĠĠ Ġval Ġctx Ġ= Ġparse Stack . pop () ĊĠĠĠ Ġnext Rule Stack . pop () ĊĠĠĠ Ġval Ġlast Object Ġ= Ġctx .` object ` ĊĠĠĠ Ġthis . last Object Ġ= Ġcast < Array Rule < *, Ġ* >>( ctx . rule ). build ( cast ( last Object )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Bool ( bool : ĠJSON . Bool ) Ġ{ ĊĠĠĠ Ġlast Object Ġ= Ġbool . to Java Object () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Bool ( bool : ĠBoolean ) Ġ{ ĊĠĠĠ Ġlast Object Ġ= Ġbool ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Null ( n : ĠJSON . Null ) Ġ{ ĊĠĠĠ Ġlast Object Ġ= Ġnull ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Null ( n : ĠUnit ?) Ġ{ ĊĠĠĠ Ġlast Object Ġ= Ġnull ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Number ( number : ĠJSON . Number <* >) Ġ{ ĊĠĠĠ Ġlast Object Ġ= Ġnumber . to Java Object () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon Number ( number : ĠNumber ) Ġ{ ĊĠĠĠ Ġlast Object Ġ= Ġnumber ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon String ( string : ĠJSON . String ) Ġ{ ĊĠĠĠ Ġlast Object Ġ= Ġstring . to Java Object () ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġon String ( string : ĠString ) Ġ{ ĊĠĠĠ Ġlast Object Ġ= Ġstring ĊĠ Ġ} ĊĊĠ Ġfun Ġcompleted (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġbegin Ġ&& Ġparse Stack . isEmpty () ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠ Ġfun Ġget (): ĠT ? Ġ{ ĊĠĠĠ Ġcheck ( completed ()) Ġ{ Ġ" not Ġcompleted Ġyet " Ġ} ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġreturn Ġlast Object Ġas ĠT ? ĊĠ Ġ} Ċ } Ċ