package Ġparser Ċ Ċ import Ġcom . google . gson .* Ċ Ċ fun Ġto Types cript ( ĊĠĠĠ Ġjson String : ĠString , ĊĠĠĠ Ġobject Name : ĠString Ġ= Ġ" Root Object ", ĊĠĠĠ Ġparse Type : ĠParse Type Ġ= ĠParse Type . Interface Struct Ċ ): ĠString Ġ{ ĊĠĠĠ Ġval Ġjson Element Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ ĠJson Parser (). parse ( json String ) ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠJson Syntax Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġe . message Ġ?: Ġ" parser Ġerror "; ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( json Element . is JsonArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Array Ġ= Ġjson Element . as JsonArray ; ĊĠĠĠĠĠĠĠ Ġif Ġ( json Array . size () Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ" export Ġtype Ġ$ objectName Ġ= Ġany []; "; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfirst Ele Ġ= Ġjson Array [ 0 ] ĊĠĠĠĠĠĠĠ Ġif Ġ( first Ele . is Json Primitive ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimitive Ġ= Ġfirst Ele . as Json Primitive ; ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġto Primitive Array ( objectName , Ġprimitive ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġtype Str Ġ= Ġto Ts Struct ( json Element . as JsonArray [ 0 ], Ġparse Type , Ġ" Root Data Item "); ĊĠĠĠĠĠĠĠ Ġreturn Ġ""" $ type Str ; Ġ Ċ export Ġtype Ġ${ objectName } s Ġ= ĠRoot Data Item []; Ċ """ ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġto Ts Struct ( json Element , Ġparse Type , Ġobject Name ) Ċ } Ċ Ċ private Ġfun Ġto Primitive Array ( name : ĠString , Ġjson Primitive : ĠJson Primitive ?): ĠString Ġ= Ġwhen Ġ( json Primitive ) Ġ{ ĊĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġ" export Ġtype Ġ$ name Ġ= Ġany []; "; ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ-> Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġjson Primitive . is Boolean Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" export Ġtype Ġ$ name Ġ= Ġboolean []; "; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjson Primitive . isString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" export Ġtype Ġ$ name Ġ= Ġstring []; "; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġjson Primitive . isNumber Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" export Ġtype Ġ$ name Ġ= Ġnumber []; "; ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ" export Ġtype Ġ$ name Ġ= Ġany []; "; ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġuppercase First Char ( key : ĠString ): ĠString Ġ= Ġkey [ 0 ]. toUpperCase () Ġ+ Ġkey . substring ( 1 , Ġkey . length ) Ċ Ċ private Ġfun Ġlowercase First Char ( key : ĠString ): ĠString Ġ= Ġkey [ 0 ]. toLowerCase () Ġ+ Ġkey . substring ( 1 , Ġkey . length ) Ċ Ċ private Ġfun Ġto Ts Struct ( ĊĠĠĠ Ġjson Element : ĠJson Element , ĊĠĠĠ Ġparse Type : ĠParse Type , ĊĠĠĠ Ġobject Name : ĠString Ġ= Ġ" Root Object ", ĊĠĠĠ Ġstruct Result : ĠMutable List < String > Ġ= Ġmutable ListOf () Ċ ): ĠString Ġ{ ĊĠĠĠ Ġval Ġoptional Keys Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġobject Result Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġval Ġjson Ġ= Ġjson Element . as JsonObject ĊĠĠĠ Ġval Ġentry Set Ġ= Ġjson . entrySet (); ĊĊĠĠĠ Ġfor Ġ( o Ġin Ġentry Set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġo . value ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġo . key ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . is JsonObject Ġ&& Ġ! value . is JsonArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild ObjectName Ġ= Ġuppercase First Char ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtype String Ġ= Ġto Ts Struct ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Element Ġ= Ġvalue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparse Type Ġ= Ġparse Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Name Ġ= Ġchild ObjectName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstruct Result Ġ= Ġstruct Result ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! struct Result . contains ( type String )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Result . add ( type String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstruct Result . add ( type String ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġ"$ child ObjectName ; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . is JsonArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Arr Ġ= Ġvalue . as JsonArray ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Types Ġ= Ġdetect Multi Array Types ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( array Types . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmulti Array Br ackets Ġ= Ġget Multi Array Br ackets ( value . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is All Equals ( array Types )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġarray Types [ 0 ]. replace (" [] ", Ġmulti Array Br ackets )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġ" any $ multi Array Br ackets ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( value Arr . size () Ġ> Ġ 0 Ġ&& Ġvalue Arr [ 0 ]. is JsonObject ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchild ObjectName Ġ= Ġuppercase First Char ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Result . add ( to Ts Struct ( value Arr [ 0 ], Ġparse Type , Ġchild ObjectName , Ġstruct Result )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġremove M aj ority ( child ObjectName ) Ġ+ Ġ"[ ]; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġarray Types [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue . is Json Primitive Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Primitive Ġ= Ġvalue . as Json Primitive ; ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Primitive . is Boolean Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġ" boolean ;"); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Primitive . isString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġ" string ;"); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson Primitive . isNumber Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġ" number ;"); ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjson . addProperty ( key , Ġ" any ; ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoptional Keys . add ( key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġresult Ġ= Ġformat Chars To TypeScript ( json , Ġobject Name , Ġoptional Keys , Ġparse Type ) ĊĠĠĠ Ġobject Result . add ( result ) ĊĠĠĠ Ġreturn Ġobject Result . join ToString ("\ n \ n ") Ċ } Ċ Ċ private Ġfun Ġis All Equals ( array : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠ Ġval Ġf ist Ġ= Ġarray [ 0 ]; ĊĠĠĠ Ġval Ġlist Ġ= Ġarray . slice ( 1 .. array . size ) ĊĠĠĠ Ġfor Ġ( item Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( item Ġ!= Ġf ist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġtrue Ċ } Ċ Ċ private Ġfun Ġget Multi Array Br ackets ( content : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġvar Ġbrackets Ġ= Ġ""; ĊĠĠĠ Ġcontent . forEach Ġ{ Ġchar Ġ-> ĊĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( char Ġ== Ġ'[ ') Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbrackets Ġ= Ġ"$ br ackets []" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbrackets Ċ } Ċ Ċ private Ġfun Ġcheck Is String ( item : ĠJson Element ): ĠBoolean Ġ= Ġitem . is Json Primitive Ġ&& Ġitem . as Json Primitive . isString Ċ Ċ private Ġfun Ġcheck Is Number ( item : ĠJson Element ): ĠBoolean Ġ= Ġitem . is Json Primitive Ġ&& Ġitem . as Json Primitive . isNumber Ċ Ċ private Ġfun Ġcheck Is Boolean ( item : ĠJson Element ): ĠBoolean Ġ= Ġitem . is Json Primitive Ġ&& Ġitem . as Json Primitive . is Boolean Ċ Ċ private Ġfun Ġcheck Json ArrayType ( json Array : ĠJson Array , Ġcheck Fn : Ġ( item : ĠJson Element ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠ Ġvar Ġret Ġ= Ġtrue ĊĠĠĠ Ġjson Array . forEach Ġ{ Ġitem Ġ-> Ġret Ġ= Ġcheck Fn ( item ) Ġ} ĊĠĠĠ Ġreturn Ġret Ċ } Ċ Ċ private Ġfun Ġdetect Multi Array Types ( ĊĠĠĠ Ġvalue : ĠJson Element , ĊĠĠĠ Ġvalue Type : ĠMutable List < String > Ġ= Ġmutable ListOf < String >() Ċ ): ĠMutable List < String > Ġ{ ĊĠĠĠ Ġval Ġlist Ġ= Ġmutable ListOf < String >() ĊĠĠĠ Ġlist . addAll ( valueType ) ĊĠĠĠ Ġif Ġ( value . is JsonArray ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġarr Ġ= Ġvalue . as JsonArray ; ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr . size () Ġ== Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add (" any []; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr [ 0 ]. is JsonArray Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( item Ġin Ġarr ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Type Result Ġ= Ġdetect Multi Array Types ( item , Ġvalue Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . addAll ( valueType Result ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Json ArrayType ( arr , Ġ:: check Is String ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add (" string []; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Json ArrayType ( arr , Ġ:: check Is Number ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add (" number []; ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Json ArrayType ( arr , Ġ:: check Is Boolean ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add (" boolean [] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlist . add (" any [] ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġlist ; Ċ } ĊĊ Ċ private Ġfun Ġremove M aj ority ( objectName : ĠString ): ĠString Ġ{ ĊĠĠĠ Ġval Ġset Ġ= Ġset Of ( Regex Option . IGNORE _ CASE ); ĊĠĠĠ Ġval Ġreg Ġ= ĠRegex (" IES $", Ġset ) ĊĠĠĠ Ġval Ġlen Ġ= Ġobject Name . length ĊĠĠĠ Ġif Ġ( reg . matches ( objectName )) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Name . substring ( 0 , Ġlen Ġ- Ġ 3 ) Ġ+ Ġ" y " ĊĠĠĠ Ġ} Ġelse Ġif Ġ( objectName . contains (" S ")) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġobject Name . substring ( 0 , Ġlen Ġ- Ġ 1 ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġobject Name Ċ } Ċ Ċ private Ġfun Ġformat Chars To TypeScript ( ĊĠĠĠ Ġjson Content : ĠJsonObject , ĊĠĠĠ Ġobject Name : ĠString , ĊĠĠĠ Ġoptional Keys : ĠList < String >, ĊĠĠĠ Ġparse Type : ĠParse Type Ċ ): ĠString Ġ{ ĊĠĠĠ Ġval Ġreg Ġ= ĠRegex ("\" ") ĊĠĠĠ Ġvar Ġresult Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġ. newBuilder () ĊĠĠĠĠĠĠĠ Ġ. set Pretty Print ing (). create () ĊĠĠĠĠĠĠĠ Ġ. toJson ( json Content ) ĊĠĠĠĠĠĠĠ Ġ. replace ( reg , Ġ"") ĊĠĠĠĠĠĠĠ Ġ. replace ( Regex ("," ), Ġ"") ĊĠĠĠ Ġval Ġentry Sets Ġ= Ġjson Content . entrySet () ĊĠĠĠ Ġfor Ġ( item Ġin Ġentry Sets ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġitem . key ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġif Ġ( optional Keys . contains ( key )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . replace ( Regex ("$ key :" ), Ġlowercase First Char ("$ key ? :" )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . replace ( Regex ("$ key :" ), Ġlowercase First Char ("$ key :" )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġnew ObjectName Ġ= Ġremove M aj ority ( objectName ) ĊĠĠĠ Ġif Ġ( parse Type Ġ== ĠParse Type . Type Struct ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" export Ġtype Ġ$ new ObjectName Ġ= Ġ$ result " ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġ" export Ġinterface Ġ$ new ObjectName Ġ$ result " Ċ Ċ } Ċ