/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠGe orge ĠGold berg . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġcom . gr undle b org . k son Ċ Ċ import Ġjava . io . Reader Ċ Ċ class ĠJson Parser ( data : ĠReader ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdata Ġ= Ġdata ĊĠĠĠ Ġprivate Ġvar Ġnext Char Ġ= Ġdata . read (). to Char () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRun Ġthe Ġparser Ġwith Ġthe Ġdata Ġit Ġwas Ġinitial ised Ġwith . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa ĠJson Value Ġrepresenting Ġthe Ġroot Ġelement Ġof Ġthe ĠJSON Ġdata Ġprovided . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġparse (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĠĠĠĠĠĠĠ Ġreturn Ġparse Value () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġnext Char Ġ= Ġdata . read (). to Char () ĊĠĠĠĠĠĠĠ Ġreturn Ġnext Char ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnext ( n : ĠInt ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. n ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext Char Ġ= Ġdata . read (). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append ( next Char ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsb . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġskip Whitespace () Ġ{ ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( next Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' Ġ', Ġ'\ n ', Ġ'\ r ', Ġ'\ t ' Ġ-> Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Value (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen ( next Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'{ ' Ġ-> Ġparse Object () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'[' Ġ-> Ġparse Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'"' Ġ-> Ġparse String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' t ' Ġ-> Ġparse True () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' f ' Ġ-> Ġparse False () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ' n ' Ġ-> Ġparse Null () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ'-', Ġ' 0 ', Ġ' 1 ', Ġ' 2 ', Ġ' 3 ', Ġ' 4 ', Ġ' 5 ', Ġ' 6 ', Ġ' 7 ', Ġ' 8 ', Ġ' 9 ' Ġ-> Ġparse Number () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" Un re cogn ised Ġparse Value : Ġ${ next Char }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Object (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠjsonObject : ĠHashMap < String , ĠJson Value > Ġ= ĠHashMap () ĊĊĠĠĠĠĠĠĠ Ġwhile ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ== Ġ' }') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Key Ġ= Ġparse String () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ!= Ġ': ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Expected Ġparse Value Ġafter ĠObject Ġkey . ĠGot : Ġ"+ next Char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Value Ġ= Ġparse Value () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ!= Ġ',' Ġ&& Ġnext Char Ġ!= Ġ' }') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Not Ġa Ġcomma Ġor Ġa Ġend Ġobject .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠjsonObject . put ( json Key . value Ġas ĠString , Ġjson Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ== Ġ' }') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠJson Value ( jsonObject ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Array (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠFIXME : ĠUse ĠKotlin Ġstyle Ġlist Ġinstantiation . ĊĠĠĠĠĠĠĠ Ġval Ġjson Array : ĠArrayList < JsonValue > Ġ= ĠArrayList () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ!= Ġ'[ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Array Ġmust Ġstart Ġwith Ġ[ Ġcharacter .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnext () ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ== Ġ' ]') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Value Ġ= Ġparse Value () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjson Array . add ( json Value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġskip Whitespace () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ== Ġ', ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( next Char Ġ== Ġ' ]') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġnext () ĊĊĠĠĠĠĠĠĠ Ġreturn ĠJson Value ( json Array ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse String (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ!= Ġ'" ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" String Ġmust Ġstart Ġwith Ġ\" Ġcharacter .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġ== Ġ'\\ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġescaped Character Ġ= Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( when Ġ( escaped Character ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' b ' Ġ-> Ġ'\ b ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' n ' Ġ-> Ġ'\ n ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' t ' Ġ-> Ġ'\ t ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' r ' Ġ-> Ġ'\ r ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' f ' Ġ-> Ġ 0 x 0 C . to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'"' Ġ-> Ġ'\" ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ'\\ ' Ġ-> Ġ'\\ ' ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ' u ' Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunicode Ġ= Ġnext ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġunicode . toInt ( radix = 1 6 ). to Char () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠException (" Un re cogn ised Ġescape Ġsequence : Ġ` \\ $ escaped Character `. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( next Char Ġ== Ġ'" ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( next Char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠJson Value ( builder . toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse True (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchars Ġ= Ġnext ( 3 ) ĊĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( chars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" r ue " Ġ-> ĠJson Value ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Field Parsing Exception (" Boolean ", Ġ" true ", Ġchars ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse False (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchars Ġ= Ġnext ( 4 ) ĊĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( chars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" alse " Ġ-> ĠJson Value ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Field Parsing Exception (" Boolean ", Ġ" false ", Ġchars ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Null (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġchars Ġ= Ġnext ( 3 ) ĊĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( chars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ull " Ġ-> ĠJson Value ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Field Parsing Exception (" null ", Ġ" null ", Ġchars ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Number (): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbuilder Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġvar Ġis Exponent ial Ġ= Ġfalse ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Char Ġin Ġ"+ - 1 2 3 4 5 6 7 8 9 0 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( next Char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( next Char Ġin Ġ" e E .") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . append ( next Char ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Exponent ial Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġresult : ĠJson Value ĊĠĠĠĠĠĠĠ Ġif Ġ( is Exponent ial ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfloat Result Ġ= Ġbuilder . toString (). toFloat () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( float Result Ġ== ĠFloat . POSITIVE _ INFINITY Ġ|| Ġfloat Result Ġ== ĠFloat . NEGATIVE _ INFINITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠJson Value ( builder . toString (). toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠJson Value ( float Result ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠJson Value ( builder . toString (). toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠNumber FormatException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= ĠJson Value ( builder . toString (). to Long ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ }