package Ġcom . github . fluid sonic . fluid . json ĊĊ Ċ internal Ġobject ĠNon Recursive Parser Ġ{ ĊĊ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċ ĉ fun Ġparse ( source : ĠJSON Reader ): ĠAny ? Ġ{ Ċĉ ĉ var Ġcurrent List : ĠMutable List < Any ?> ? Ġ= Ġnull Ċĉ ĉ var Ġcurrent Key : ĠString ? Ġ= Ġnull Ċĉ ĉ var Ġcurrent Map : ĠMutable Map < Any ?, ĠAny ?> ? Ġ= Ġnull Ċĉ ĉ val Ġparents Ġ= Ġmutable ListOf < Any >() Ċĉ ĉ val Ġparent Keys Ġ= Ġmutable ListOf < String >() ĊĊĉ ĉ loop @ Ġwhile Ġ( true ) Ġ{ Ċĉĉ ĉ val Ġvalue : ĠAny ? Ġ= Ġwhen Ġ( source . nextToken ) Ġ{ Ċĉĉĉ ĉ JSON Token . boolean Value Ġ-> Ċĉĉĉĉ ĉ source . read Boolean () ĊĊĉĉĉ ĉ JSON Token . list End Ġ-> Ġ{ Ċĉĉĉĉ ĉ source . read List End () ĊĊĉĉĉĉ ĉ val Ġlist Ġ= Ġcurrent List ĊĊĉĉĉĉ ĉ val Ġparent Count Ġ= Ġparents . size Ċĉĉĉĉ ĉ if Ġ( parent Count Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġparent Ġ= Ġparents . remove At ( parent Count Ġ- Ġ 1 ) Ċĉĉĉĉĉ ĉ if Ġ( parent Ġis ĠMutable List <* >) Ġ{ Ċĉĉĉĉĉĉ ĉ current List Ġ= Ġparent Ġas ĠMutable List < Any ?> Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉĉ ĉ current List Ġ= Ġnull Ċĉĉĉĉĉĉ ĉ current Map Ġ= Ġparent Ġas ĠMutable Map < Any ?, ĠAny ?> Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉ ĉ current List Ġ= Ġnull Ċĉĉĉĉĉ ĉ current Map Ġ= Ġnull Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ list Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ JSON Token . list Start Ġ-> Ġ{ Ċĉĉĉĉ ĉ source . read List Start () ĊĊĉĉĉĉ ĉ val Ġlist Ġ= Ġmutable ListOf < Any ?> () Ċĉĉĉĉ ĉ if Ġ( current List Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉĉ ĉ parents Ġ+= Ġcurrent List Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ġif Ġ( current Map Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉĉ ĉ parents Ġ+= Ġcurrent Map Ċĉĉĉĉĉ ĉ current Map Ġ= Ġnull Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ current List Ġ= Ġlist Ċĉĉĉĉ ĉ continue @ loop Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ JSON Token . null Value Ċĉĉĉ ĉ -> Ġsource . read Null () ĊĊĉĉĉ ĉ JSON Token . map End Ġ-> Ġ{ Ċĉĉĉĉ ĉ source . read Map End () ĊĊĉĉĉĉ ĉ val Ġmap Ġ= Ġcurrent Map ĊĊĉĉĉĉ ĉ val Ġparent Count Ġ= Ġparents . size Ċĉĉĉĉ ĉ if Ġ( parent Count Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ val Ġparent Ġ= Ġparents . remove At ( parent Count Ġ- Ġ 1 ) Ċĉĉĉĉĉ ĉ if Ġ( parent Ġis ĠMutable Map < *, Ġ* >) Ġ{ Ċĉĉĉĉĉĉ ĉ current Map Ġ= Ġparent Ġas ĠMutable Map < Any ?, ĠAny ?> Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉĉ ĉ current List Ġ= Ġparent Ġas ĠMutable List < Any ?> Ċĉĉĉĉĉĉ ĉ current Map Ġ= Ġnull Ċĉĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ġ{ Ċĉĉĉĉĉ ĉ current List Ġ= Ġnull Ċĉĉĉĉĉ ĉ current Map Ġ= Ġnull Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ val Ġparent Key Count Ġ= Ġparent Keys . size Ċĉĉĉĉ ĉ if Ġ( parent Key Count Ġ> Ġ 0 ) Ġ{ Ċĉĉĉĉĉ ĉ current Key Ġ= Ġparent Keys . remove At ( parent Key Count Ġ- Ġ 1 ) Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ map Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ JSON Token . map Key Ġ-> Ġ{ Ċĉĉĉĉ ĉ current Key Ġ= Ġsource . read Map Key () Ċĉĉĉĉ ĉ continue @ loop Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ JSON Token . map Start Ġ-> Ġ{ Ċĉĉĉĉ ĉ source . read Map Start () ĊĊĉĉĉĉ ĉ val Ġmap Ġ= Ġmutable Map Of < Any ?, ĠAny ?> () Ċĉĉĉĉ ĉ if Ġ( current Map Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉĉ ĉ parents Ġ+= Ġcurrent Map Ċĉĉĉĉ ĉ } Ċĉĉĉĉ ĉ else Ġif Ġ( current List Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉĉ ĉ parents Ġ+= Ġcurrent List Ċĉĉĉĉĉ ĉ current List Ġ= Ġnull Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ if Ġ( current Key Ġ!= Ġnull ) Ġ{ Ċĉĉĉĉĉ ĉ parent Keys Ġ+= Ġcurrent Key Ċĉĉĉĉĉ ĉ current Key Ġ= Ġnull Ċĉĉĉĉ ĉ } ĊĊĉĉĉĉ ĉ current Map Ġ= Ġmap Ċĉĉĉĉ ĉ continue @ loop Ċĉĉĉ ĉ } ĊĊĉĉĉ ĉ JSON Token . number Value Ġ-> Ċĉĉĉĉ ĉ source . read Number () ĊĊĉĉĉ ĉ JSON Token . stringValue Ġ-> Ċĉĉĉĉ ĉ source . readString () ĊĊĉĉĉ ĉ else Ġ-> Ċĉĉĉĉ ĉ throw ĠIllegalStateException (" reader Ġis Ġmes sed Ġup ") Ċĉĉ ĉ } ĊĊĉĉ ĉ when Ġ{ Ċĉĉĉ ĉ current List Ġ!= Ġnull Ġ-> Ġcurrent List . add ( value ) Ċĉĉĉ ĉ current Map Ġ!= Ġnull Ġ-> Ġcurrent Map [ current Key ] Ġ= Ġvalue Ċĉĉĉ ĉ else Ġ-> Ġreturn Ġvalue Ġ?: Ġthrow ĠIllegalStateException (" reader Ġis Ġmes sed Ġup ") Ċĉĉ ĉ } Ċĉ ĉ } Ċ ĉ } ĊĊ Ċ } Ċ