package Ġorg . x def . translator . definition . json Ċ Ċ import Ġcom . fasterxml . jackson . core . Json Factory Ċ import Ġcom . fasterxml . jackson . core . Json Generator Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġorg . apache . logging . log 4 j . kotlin . Logging Ċ import Ġorg . x def . core . document . data . X Value Ċ import Ġorg . x def . core . document . definition .* Ċ import Ġorg . x def . core . lang . Event Ċ import Ġorg . x def . core . lang . Occurrence Ċ import Ġorg . x def . translator . JSON _ ROOT _ NODE _ NAME Ċ import Ġorg . x def . translator . definition . Definition Translator Ċ import Ġorg . x def . translator . definition . Definition Translator IO Ċ import Ġorg . x def . translator . definition . json . model . JsonArray X Def Node Ċ import Ġorg . x def . translator . definition . json . model . JsonObject X Def Node Ċ import Ġorg . x def . translator . definition . json . model . Json X Def Document Ċ import Ġorg . x def . translator . definition . json . model . Json X Def Leaf Ċ import Ġorg . x def . translator . document . json . model . Json X Boolean Ċ import Ġorg . x def . translator . document . json . model . Json X Number Ċ import Ġorg . x def . translator . document . json . model . Json X String Ċ import Ġorg . x def . translator . document . json . model . Json X Value Ċ import Ġorg . x def . translator . document . json . std .* Ċ import Ġorg . x def . translator . extract Location Ċ import Ġorg . x def . translator . indexed Name Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ import Ġjava . io . Reader Ċ import Ġjava . io . Writer Ċ import Ġjavax . json . Json Number Ċ import Ġjavax . json . JsonObject Ċ import Ġjavax . json . Json String Ċ import Ġjavax . json . JsonValue Ċ Ċ /** Ċ Ġ* ĠJSON ĠX - definition Ġdocument Ġtranslator Ċ Ġ* ĠIt Ġtrans lates Ġtree Ġform Ġof Ġdocument Ġto Ġinner ĠX - definition Ġdocument Ġrepresentation Ġand Ġback Ċ Ġ* Ċ Ġ* Ġ@ author Ġ[ Fil ip ĠÅ ł m ÃŃ d ]( mailto : sm id fil 3 @ fit . cv ut . cz ) Ċ Ġ* Ċ Ġ* Ġ@ see ĠDefinition Translator Ċ Ġ* Ġ@ see ĠDefinition Translator IO Ċ Ġ*/ Ċ class ĠJson Definition Translator Ġ: ĠDefinition Translator < JsonValue >, ĠDefinition Translator IO , ĠLogging Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠX _ SCRIPT _ IDENTIFIER Ġ= Ġ" xd : script " ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO ĠDetermine Ġit ĊĠĠĠĠĠĠĠ Ġ// ĠNow Ġsame Ġfor Ġall ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTR UCT URE _ ALLOWED _ OCC UR RE NC ES Ġ= ĠlistOf < Occurrence >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠSTR UCT URE _ ALLOWED _ EVENTS Ġ= ĠlistOf < Event >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTRIBUT E _ ALLOWED _ OCC UR RE NC ES Ġ= ĠlistOf < Occurrence >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠATTRIBUT E _ ALLOWED _ EVENTS Ġ= ĠlistOf < Event >() ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠVALUE _ ALLOWED _ OCC UR RE NC ES Ġ= ĠlistOf < Occurrence >() ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠVALUE _ ALLOWED _ EVENTS Ġ= ĠlistOf < Event >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġfactory Ġ= ĠJson Factory () ĊĊĠĠĠ Ġoverride Ġfun Ġtranslate ( dom : ĠJson Value ) Ġ= ĠJson X Def Document ( this . json Value 2 X Def Tree ( JSON _ ROOT _ NODE _ NAME , Ġdom )) ĊĊĠĠĠ Ġoverride Ġfun Ġtranslate ( definition : ĠX Def Document ): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠName Ġwas Ġadd ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( JSON _ ROOT _ NODE _ NAME Ġ== Ġdefinition . root . name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġx Def Tree 2 JsonValue ( definition . root ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal ized JsonObject ( map Of ( definition . root . name Ġto Ġx Def Tree 2 JsonValue ( definition . root ))) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġread Definition ( input : ĠInputStream ) Ġ= Ġread Definition ( factory . create Parser ( input )) ĊĊĠĠĠ Ġoverride Ġfun Ġread Definition ( input : ĠReader ) Ġ= Ġread Definition ( factory . create Parser ( input )) ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Definition ( definition : ĠX Def Document , Ġoutput : ĠOutputStream ) Ġ= ĊĠĠĠĠĠĠĠ Ġwrite Definition ( definition , Ġfactory . create Generator ( output )) ĊĊĠĠĠ Ġoverride Ġfun Ġwrite Definition ( definition : ĠX Def Document , Ġoutput : ĠWriter ) Ġ= ĊĠĠĠĠĠĠĠ Ġwrite Definition ( definition , Ġfactory . create Generator ( output )) ĊĊĠĠĠ Ġprivate Ġfun Ġread Definition ( reader : ĠJson Parser ): ĠX Def Document Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Value Ġ= ĠLocal ized Json Tree . read Tree ( reader ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtranslate ( require NotNull ( json Value ) Ġ{ Ġ" Parsed Ġdefinition Ġis Ġempty " Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Definition ( document : ĠX Def Document , Ġwriter : ĠJson Generator ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Value Ġ= Ġtranslate ( document ) ĊĠĠĠĠĠĠĠ Ġwriter . use Default PrettyPrinter () Ġ// ĠTODO : ĠOnly Ġdebug ĊĠĠĠĠĠĠĠ ĠLocal ized Json Tree . write Tree ( writer , Ġjson Value ) ĊĠĠĠĠĠĠĠ Ġwriter . flush () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġjson Value 2 X Def Tree ( nodeName : ĠString , Ġvalue : ĠJson Value ): ĠX Def Tree Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( value . valueType !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . OBJECT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġas ĠJsonObject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( attributes , Ġchildren ) Ġ= Ġvalue . entries . partition Ġ{ Ġ(_, Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( value . valueType !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstructures ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . OBJECT , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . ARRAY Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprimitives ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . STRING , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . NUMBER , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . TRUE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . FALSE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . NULL Ġ-> Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( scripts , Ġattrs ) Ġ= Ġattributes . partition Ġ{ Ġ( name , Ġ_) Ġ-> ĠX _ SCRIPT _ IDENTIFIER Ġ== Ġname Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġscript Ġ= Ġwhen Ġ( scripts . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġscripts [ 0 ]. value . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Definition Ġhas Ġmore Ġscript Ġdeclarations , Ġfirst Ġlog Ġis Ġused ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscripts [ 0 ]. value . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠJsonObject X Def Node ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠnodeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ġ= Ġscript , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Ġ= Ġattrs . map Ġ{ Ġ( name , Ġvalue ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠX Def Attribute ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġjson Value 2 X Value ( value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Occ urrences Ġ= ĠATTRIBUT E _ ALLOWED _ OCC UR RE NC ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Events Ġ= ĠATTRIBUT E _ ALLOWED _ EVENTS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġchildren . map Ġ{ Ġ( name , Ġchild ) Ġ-> Ġthis . json Value 2 X Def Tree ( name , Ġchild ) Ġ}. toList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Occ urrences Ġ= ĠSTR UCT URE _ ALLOWED _ OCC UR RE NC ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Events Ġ= ĠSTR UCT URE _ ALLOWED _ EVENTS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġvalue . extract Location () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . ARRAY Ġ-> ĠJson Array X Def Node ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠnodeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscript Ġ= Ġnull , Ġ// ĠJSON Ġarray Ġhasn 't Ġscript ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren Ġ= Ġvalue . as JsonArray (). map Indexed Ġ{ Ġindex , Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . json Value 2 X Def Tree ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnodeName Ġ= Ġindexed Name ( nodeName , Ġindex ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġchild ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Occ urrences Ġ= ĠSTR UCT URE _ ALLOWED _ OCC UR RE NC ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Events Ġ= ĠSTR UCT URE _ ALLOWED _ EVENTS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġvalue . extract Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . STRING , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . NUMBER , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . TRUE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . FALSE , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . NULL Ġ-> ĠJson X Def Leaf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= ĠnodeName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Ġ= Ġjson Value 2 X Value ( value ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Occ urrences Ġ= ĠVALUE _ ALLOWED _ OCC UR RE NC ES , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġallowed Events Ġ= ĠVALUE _ ALLOWED _ EVENTS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= Ġvalue . extract Location () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalArgumentException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġjson Value 2 X Value ( value : ĠJson Value ): ĠJson X Value < *> ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( value . valueType !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . STRING Ġ-> ĠJson X String (( value Ġas ĠJson String ). string , Ġvalue . extract Location ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . NUMBER Ġ-> ĠJson X Number (( value Ġas ĠJson Number ). big Decimal Value (), Ġvalue . extract Location ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . TRUE Ġ-> ĠJson X Boolean ( true , Ġvalue . extract Location ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . FALSE Ġ-> ĠJson X Boolean ( false , Ġvalue . extract Location ()) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . NULL Ġ-> Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . ARRAY , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Value . ValueType . OBJECT Ġ-> Ġthrow ĠIllegalArgumentException (" Not ĠJSON Ġprimitive : Ġ${ value :: class . simple Name }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġx Def Tree 2 JsonValue ( tree : ĠX Def Tree ): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( tree ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠX Def Leaf Ġ-> Ġx Value 2 JsonValue ( tree . value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠX Def Node Ġ-> Ġwhen Ġ( tree ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAttributes Ġis Ġignored ! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJson Array X Def Node Ġ-> ĠLocal ized JsonArray ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue List Ġ= Ġtree . children . map Ġ{ Ġx Def Tree 2 JsonValue ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJsonObject X Def Node Ġ-> ĠLocal ized JsonObject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Map Ġ= Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtree . attributes . map Ġ{ Ġit . name Ġto Ġx Value 2 JsonValue ( it . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġtree . children . map Ġ{ Ġit . name Ġto Ġx Def Tree 2 JsonValue ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġscript Ġas Ġobject Ġattribute ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġif Ġ( tree . script Ġ!= Ġnull ) ĠlistOf ( X _ SCRIPT _ IDENTIFIER Ġto ĠLocal ized Json String ( tree . script !! )) Ġelse Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLocal ized JsonObject ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue Map Ġ= Ġ( tree . attributes . map Ġ{ Ġit . name Ġto Ġx Value 2 JsonValue ( it . value ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġscript Ġas Ġobject Ġattribute ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġif Ġ( tree . script Ġ!= Ġnull ) ĠlistOf ( X _ SCRIPT _ IDENTIFIER Ġto ĠLocal ized Json String ( tree . script !! )) Ġelse Ġempty List < Pair < String , ĠJson Value >>() ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ+ Ġtree . children ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. groupBy Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ( name , Ġchildren ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( children . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġto Ġx Def Tree 2 JsonValue ( children . single ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġto ĠLocal ized JsonArray ( value List Ġ= Ġchildren . map Ġ{ Ġx Def Tree 2 JsonValue ( it ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}). toMap () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġx Value 2 JsonValue ( value : ĠX Value ?): ĠJson Value Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJson X Value < *> Ġ-> Ġwhen Ġ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJson X Boolean Ġ-> ĠLocal ized Json Boolean ( value . typed Value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJson X Number Ġ-> ĠLocal ized Json Number ( value . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠJson X String Ġ-> ĠLocal ized Json String ( value . typed Value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> ĠJson Value . NULL ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠLocal ized Json String ( value . value ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ