@@ -107,6 +107,9 @@ namespace _JSON {
107
107
}
108
108
}
109
109
110
+ // @ts -ignore
111
+ @lazy const NULL : Null = new Null ( ) ;
112
+
110
113
export abstract class Value {
111
114
static String ( str : string ) : Str {
112
115
return new Str ( str ) ;
@@ -124,7 +127,7 @@ export abstract class Value {
124
127
return new Bool ( b ) ;
125
128
}
126
129
static Null ( ) : Null {
127
- return new Null ( ) ;
130
+ return NULL ;
128
131
}
129
132
static Array ( ) : Arr {
130
133
return new Arr ( ) ;
@@ -189,10 +192,7 @@ export abstract class Value {
189
192
return false ;
190
193
}
191
194
192
- toString ( ) : string {
193
- throw new Error ( "Values must be casted to their JSON type for .toString()" ) ;
194
- return "" ;
195
- }
195
+ abstract toString ( ) : string ;
196
196
}
197
197
198
198
export class Str extends Value {
@@ -201,7 +201,7 @@ export class Str extends Value {
201
201
}
202
202
203
203
toString ( ) : string {
204
- return this . _str ;
204
+ return `" ${ this . _str } "` ;
205
205
}
206
206
207
207
valueOf ( ) : string {
@@ -307,47 +307,14 @@ export class Obj extends Value {
307
307
}
308
308
309
309
toString ( ) : string {
310
- const objs : string [ ] = [ ] ;
310
+ const objs : string [ ] = new Array < string > ( this . keys . length ) ;
311
311
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 } ` ;
349
315
}
350
- return "{" + objs . join ( "," ) + "}" ;
316
+
317
+ return `{${ objs . join ( "," ) } }` ;
351
318
}
352
319
353
320
valueOf ( ) : Map < string , Value > {
0 commit comments