@@ -301,14 +301,6 @@ private struct JSONWriter {
301
301
let pretty : Bool
302
302
let sortedKeys : Bool
303
303
let writer : ( String ? ) -> Void
304
-
305
- private lazy var _numberformatter : CFNumberFormatter = {
306
- let formatter : CFNumberFormatter
307
- formatter = CFNumberFormatterCreate ( nil , CFLocaleCopyCurrent ( ) , kCFNumberFormatterNoStyle)
308
- CFNumberFormatterSetProperty ( formatter, kCFNumberFormatterMaxFractionDigits, NSNumber ( value: 15 ) )
309
- CFNumberFormatterSetFormat ( formatter, " 0.############### " . _cfObject)
310
- return formatter
311
- } ( )
312
304
313
305
init ( pretty: Bool = false , sortedKeys: Bool = false , writer: @escaping ( String ? ) -> Void ) {
314
306
self . pretty = pretty
@@ -334,75 +326,49 @@ private struct JSONWriter {
334
326
case let str as String :
335
327
try serializeString ( str)
336
328
case let boolValue as Bool :
337
- serializeBool ( boolValue)
329
+ writer ( boolValue. description )
338
330
case let num as Int :
339
- serializeInteger ( value : num)
331
+ writer ( num. description )
340
332
case let num as Int8 :
341
- serializeInteger ( value : num)
333
+ writer ( num. description )
342
334
case let num as Int16 :
343
- serializeInteger ( value : num)
335
+ writer ( num. description )
344
336
case let num as Int32 :
345
- serializeInteger ( value : num)
337
+ writer ( num. description )
346
338
case let num as Int64 :
347
- serializeInteger ( value : num)
339
+ writer ( num. description )
348
340
case let num as UInt :
349
- serializeInteger ( value : num)
341
+ writer ( num. description )
350
342
case let num as UInt8 :
351
- serializeInteger ( value : num)
343
+ writer ( num. description )
352
344
case let num as UInt16 :
353
- serializeInteger ( value : num)
345
+ writer ( num. description )
354
346
case let num as UInt32 :
355
- serializeInteger ( value : num)
347
+ writer ( num. description )
356
348
case let num as UInt64 :
357
- serializeInteger ( value : num)
349
+ writer ( num. description )
358
350
case let array as Array < Any ? > :
359
351
try serializeArray ( array)
360
352
case let dict as Dictionary < AnyHashable , Any ? > :
361
353
try serializeDictionary ( dict)
362
354
case let num as Float :
363
- try serializeNumber ( NSNumber ( value : num) )
355
+ try serializeFloat ( num)
364
356
case let num as Double :
365
- try serializeNumber ( NSNumber ( value : num) )
357
+ try serializeFloat ( num)
366
358
case let num as Decimal :
367
359
writer ( num. description)
368
360
case let num as NSDecimalNumber :
369
361
writer ( num. description)
370
362
case is NSNull :
371
363
try serializeNull ( )
372
364
case _ where __SwiftValue. store ( obj) is NSNumber :
373
- try serializeNumber ( __SwiftValue. store ( obj) as! NSNumber )
365
+ let num = __SwiftValue. store ( obj) as! NSNumber
366
+ writer ( num. description)
374
367
default :
375
368
throw NSError ( domain: NSCocoaErrorDomain, code: CocoaError . propertyListReadCorrupt. rawValue, userInfo: [ " NSDebugDescription " : " Invalid object cannot be serialized " ] )
376
369
}
377
370
}
378
371
379
- private func serializeInteger< T: UnsignedInteger > ( value: T , isNegative: Bool = false ) {
380
- let maxIntLength = 22 // 20 digits in UInt64 + optional sign + trailing '\0'
381
- let asciiZero : CChar = 0x30 // ASCII '0' == 0x30
382
- let asciiMinus : CChar = 0x2d // ASCII '-' == 0x2d
383
-
384
- var number = UInt64 ( value)
385
- var buffer = Array < CChar > ( repeating: 0 , count: maxIntLength)
386
- var pos = maxIntLength - 1
387
-
388
- repeat {
389
- pos -= 1
390
- buffer [ pos] = asciiZero + CChar( number % 10 )
391
- number /= 10
392
- } while number != 0
393
-
394
- if isNegative {
395
- pos -= 1
396
- buffer [ pos] = asciiMinus
397
- }
398
- let output = String ( cString: Array ( buffer. suffix ( from: pos) ) )
399
- writer ( output)
400
- }
401
-
402
- private func serializeInteger< T: SignedInteger > ( value: T ) {
403
- serializeInteger ( value: UInt64 ( value. magnitude) , isNegative: value < 0 )
404
- }
405
-
406
372
func serializeString( _ str: String ) throws {
407
373
writer ( " \" " )
408
374
for scalar in str. unicodeScalars {
@@ -434,37 +400,24 @@ private struct JSONWriter {
434
400
writer ( " \" " )
435
401
}
436
402
437
- func serializeBool( _ bool: Bool ) {
438
- switch bool {
439
- case true :
440
- writer ( " true " )
441
- case false :
442
- writer ( " false " )
403
+ private func serializeFloat< T: FloatingPoint & LosslessStringConvertible > ( _ num: T ) throws {
404
+ guard num. isFinite else {
405
+ throw NSError ( domain: NSCocoaErrorDomain, code: CocoaError . propertyListReadCorrupt. rawValue, userInfo: [ " NSDebugDescription " : " Invalid number value ( \( num) ) in JSON write " ] )
443
406
}
407
+ var str = num. description
408
+ if str. hasSuffix ( " .0 " ) {
409
+ str. removeLast ( 2 )
410
+ }
411
+ writer ( str)
444
412
}
445
413
446
414
mutating func serializeNumber( _ num: NSNumber ) throws {
447
415
if CFNumberIsFloatType ( num. _cfObject) {
448
- let dv = num. doubleValue
449
- if !dv. isFinite {
450
- let value : String
451
- if dv. isNaN {
452
- value = " NaN "
453
- } else if dv. isInfinite {
454
- value = " infinite "
455
- } else {
456
- value = String ( dv)
457
- }
458
-
459
- throw NSError ( domain: NSCocoaErrorDomain, code: CocoaError . propertyListReadCorrupt. rawValue, userInfo: [ " NSDebugDescription " : " Invalid number value ( \( value) ) in JSON write " ] )
460
- }
461
-
462
- let string = CFNumberFormatterCreateStringWithNumber ( nil , _numberformatter, num. _cfObject) . _swiftObject
463
- writer ( string)
416
+ try serializeFloat ( num. doubleValue)
464
417
} else {
465
418
switch num. _cfTypeID {
466
419
case CFBooleanGetTypeID ( ) :
467
- serializeBool ( num. boolValue)
420
+ writer ( num. boolValue. description )
468
421
default :
469
422
writer ( num. stringValue)
470
423
}
0 commit comments