@@ -107,6 +107,9 @@ namespace _JSON {
107107 }
108108}
109109
110+ // @ts -ignore
111+ @lazy const NULL : Null = new Null ( ) ;
112+
110113export abstract class Value {
111114 static String ( str : string ) : Str {
112115 return new Str ( str ) ;
@@ -124,7 +127,7 @@ export abstract class Value {
124127 return new Bool ( b ) ;
125128 }
126129 static Null ( ) : Null {
127- return new Null ( ) ;
130+ return NULL ;
128131 }
129132 static Array ( ) : Arr {
130133 return new Arr ( ) ;
@@ -189,10 +192,7 @@ export abstract class Value {
189192 return false ;
190193 }
191194
192- toString ( ) : string {
193- throw new Error ( "Values must be casted to their JSON type for .toString()" ) ;
194- return "" ;
195- }
195+ abstract toString ( ) : string ;
196196}
197197
198198export class Str extends Value {
@@ -201,7 +201,7 @@ export class Str extends Value {
201201 }
202202
203203 toString ( ) : string {
204- return this . _str ;
204+ return `" ${ this . _str } "` ;
205205 }
206206
207207 valueOf ( ) : string {
@@ -307,47 +307,14 @@ export class Obj extends Value {
307307 }
308308
309309 toString ( ) : string {
310- const objs : string [ ] = [ ] ;
310+ const objs : string [ ] = new Array < string > ( this . keys . length ) ;
311311 for ( let i : i32 = 0 ; i < this . keys . length ; i ++ ) {
312- let keyValueString = '"' + this . keys [ i ] + '": ' ;
313-
314- // Cast our value into it's appropriate type
315- let value : Value | null = this . _obj . get ( this . keys [ i ] ) ;
316-
317- // Check for null values
318- if ( value == null || value . isNull ) {
319- objs . push ( keyValueString += "null" ) ;
320- continue ;
321- }
322-
323- // Cast to our proper type
324- if ( value . isString ) {
325- let castedValue = changetype < Str > ( value ) ;
326- keyValueString += '"' + castedValue . toString ( ) + '"' ;
327- } else if ( value . isNum ) {
328- let castedValue = changetype < Num > ( value ) ;
329- keyValueString += castedValue . toString ( ) ;
330- } else if ( value . isFloat ) {
331- let castedValue = changetype < Float > ( value ) ;
332- keyValueString += castedValue . toString ( ) ;
333- } else if ( value . isInteger ) {
334- let castedValue = changetype < Integer > ( value ) ;
335- keyValueString += castedValue . toString ( ) ;
336- } else if ( value . isBool ) {
337- let castedValue = changetype < Bool > ( value ) ;
338- keyValueString += castedValue . toString ( ) ;
339- } else if ( value . isArr ) {
340- let castedValue = changetype < Arr > ( value ) ;
341- keyValueString += castedValue . toString ( ) ;
342- } else if ( value . isObj ) {
343- let castedValue = changetype < Obj > ( value ) ;
344- keyValueString += castedValue . toString ( ) ;
345- }
346-
347- // Push the keyValueString
348- objs . push ( keyValueString ) ;
312+ const key = this . keys [ i ] ;
313+ const value = this . _obj . get ( key ) || Value . Null ( ) ;
314+ objs [ i ] = `"${ key } ":${ value } ` ;
349315 }
350- return "{" + objs . join ( "," ) + "}" ;
316+
317+ return `{${ objs . join ( "," ) } }` ;
351318 }
352319
353320 valueOf ( ) : Map < string , Value > {
0 commit comments