package Ġorg . from source . ki wi . json Ċ Ċ class ĠJson Parser Ġ{ ĊĠĠĠ Ġfun Ġparse ( value : ĠString ): ĠJson Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtokens Ġ= Ġvalue . toCharArray (). drop While Ġ{ Ġit . is Whitespace () Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġ( json , Ġrest ) Ġ= Ġparse ( tokens ) ĊĠĠĠĠĠĠĠ Ġval Ġtrimmed Ġ= Ġrest . drop While Ġ{ Ġit . whitespace () Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( trimmed . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjson ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠJson Exception (" Unexpected Ġcharacter Ġ'${ trimmed . first () }' ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse ( tokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtokens . first OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . open Object () Ġ-> Ġstart Parse Object ( JsonObject (), Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . open Array () Ġ-> Ġstart Parse Array ( JsonArray (), Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġparse Value ( tokens ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġstart Parse Array ( json : ĠJson Array , Ġtokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtokens . first OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . whitespace () Ġ-> Ġstart Parse Array ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . close Array () Ġ-> ĠParsing C xt ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . isNull () Ġ-> Ġthrow ĠJson Exception (" Unexpected Ġend Ġof Ġjson ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( value , Ġrest ) Ġ= Ġparse Value ( tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Array ( json Ġ+ Ġvalue , Ġrest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġparse Array ( json : ĠJson Array , Ġtokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtokens . first OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . whitespace () Ġ-> Ġparse Array ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . close Array () Ġ-> ĠParsing C xt ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . isNull () Ġ-> Ġthrow ĠJson Exception (" Unexpected Ġend Ġof Ġjson ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . comma () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( value , Ġrest ) Ġ= Ġparse Value ( tokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Array ( json Ġ+ Ġvalue , Ġrest ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Exception (" Unrecognized Ġcharacter Ġ'$ token '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġstart Parse Object ( json : ĠJsonObject , Ġtokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtokens . first OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . whitespace () Ġ-> Ġstart Parse Object ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . close Object () Ġ-> ĠParsing C xt ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . quotation () Ġ-> Ġparse Name Value ( json , Ġtokens ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . isNull () Ġ-> Ġthrow ĠJson Exception (" Unexpected Ġend Ġof Ġjson ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Exception (" Unrecognized Ġcharacter Ġ'$ token '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġparse Object ( json : ĠJsonObject , Ġtokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtokens . first OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . whitespace () Ġ-> Ġparse Object ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . close Object () Ġ-> ĠParsing C xt ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . comma () Ġ-> Ġparse Name Value ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . isNull () Ġ-> Ġthrow ĠJson Exception (" Unexpected Ġend Ġof Ġjson ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Exception (" Unrecognized Ġcharacter Ġ'$ token '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġparse Name Value ( json : ĠJsonObject , Ġtokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtokens . first OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . whitespace () Ġ-> Ġparse Name Value ( json , Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . quotation () Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( key , Ġrest ) Ġ= Ġtokens . next String () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Rest Ġ= Ġrest . drop While Ġ{ Ġit . whitespace () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġseparator Ġ= Ġnew Rest . first OrNull () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Rest Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator . colon () Ġ-> Ġnew Rest . tail () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseparator . isNull () Ġ-> Ġthrow ĠJson Exception (" Unexpected Ġend Ġof Ġjson ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Exception (" Unrecognized Ġcharacter Ġ'$ separator '") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( value , Ġrest Object ) Ġ= Ġparse Value ( value Rest ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparse Object ( json . set ( key , Ġvalue ), Ġrest Object ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . isNull () Ġ-> Ġthrow ĠJson Exception (" Unexpected Ġend Ġof Ġjson ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Exception (" Unrecognized Ġcharacter Ġ'$ token '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġtail rec Ġfun Ġparse Value ( tokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġtokens . first OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . minus () Ġ-> Ġparse Number Value ( tokens , Ġnegative Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . digit () Ġ-> Ġparse Number Value ( tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . quotation () Ġ-> Ġparse StringValue ( tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . bool Start () Ġ-> Ġparse BoolValue ( tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . whitespace () Ġ-> Ġparse Value ( tokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . open Object () Ġ-> Ġstart Parse Object ( JsonObject (), Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . open Array () Ġ-> Ġstart Parse Array ( JsonArray (), Ġtokens . tail ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken . start Null () Ġ-> Ġparse Null ( tokens ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Exception (" Unrecognized Ġcharacter Ġ'$ token '") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Null ( tokens : ĠList < Char >) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġtokens . startsWith ( NULL ) Ġ-> ĠParsing C xt ( Json Null , Ġtokens . drop ( NULL . length )) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunknown Ġ= Ġtokens . take While Ġ{ Ġ! it . is Whitespace () Ġ}. join ToString ( separator Ġ= Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠJson Exception (" Unrecognized Ġvalue Ġ'${ unknown }' ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse StringValue ( tokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsplit ed Ġ= Ġtokens . split (' "', Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġval Ġstring Ġ= Ġsplit ed . first . take ( split ed . first . size Ġ- Ġ 1 ). tail (). join ToString ( separator Ġ= Ġ"") ĊĠĠĠĠĠĠĠ Ġreturn ĠParsing C xt ( Json String ( string ), Ġsplit ed . second ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse BoolValue ( tokens : ĠList < Char >): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( value , Ġrest Object ) Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . startsWith ( TRUE ) Ġ-> ĠPair ( true , Ġtokens . drop ( TRUE . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtokens . startsWith ( FALSE ) Ġ-> ĠPair ( false , Ġtokens . drop ( FALSE . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Exception (" Unrecognized Ġboolean Ġvalue ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠParsing C xt ( Json Boolean ( value ), Ġrest Object ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Number Value ( tokens : ĠList < Char >, Ġnegative : ĠBoolean Ġ= Ġfalse ): ĠParsing C xt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnumber Ġ= Ġtokens . take While Ġ{ Ġit . digit () Ġ|| Ġit . fraction () Ġ|| Ġit . minus () Ġ|| Ġit . plus () Ġ|| Ġit . expo () Ġ}. join ToString ( separator Ġ= Ġ"") ĊĠĠĠĠĠĠĠ Ġval Ġlong Ġ= Ġnumber . to Long OrNull () ĊĠĠĠĠĠĠĠ Ġval Ġdouble Ġ= Ġnumber . toDouble OrNull () ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlong Ġ!= Ġnull Ġ-> ĠParsing C xt ( Json Number ( long ), Ġtokens . drop ( number . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdouble Ġ!= Ġnull Ġ-> ĠParsing C xt ( Json Number ( double ), Ġtokens . drop ( number . length )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠJson Exception (" Can Ġnot Ġparse Ġnumber Ġ$ number ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠNULL Ġ= Ġ" null " ĊĠĠĠ Ġ} Ċ } Ċ Ċ data Ġclass ĠParsing C xt ( val Ġjson : ĠJson , Ġval Ġrest : ĠList < Char >)