[swift-users] I've found a serious Bug in JSON encoding (SR-6631) and would like to fix it. [Sorry for the multiple posts]

Benoit Pereira da silva bpds at me.com
Mon Dec 18 05:12:36 CST 2017


Dear all

I've found a serious Bug in the JSON encoding foundations. [ SR-6631 <https://bugs.swift.org/browse/SR-6631> ]

This bug cause JSON encoding issues on Doubles when using a locale that does not use dot as decimal separator e.g « fr_FR » (we use a coma)
When using such a locale JSONEncoder & JSONSerialization encodes the Double value with the localized decimal separator. 

Code proof of the issue : 

import Foundation

// Required to call setLocale
import Darwin

// Let's set to french
setlocale(LC_ALL,"fr_FR")
 
struct Shot:Codable{
    let seconds:Double
}
 
let shot = Shot(seconds: 1.1)
 
do{
    let data = try JSONEncoder().encode(shot)
    if let json =  String(data:data, encoding:.utf8){
        // the result is : "{"seconds":1,1000000000000001} »
	// should be : "{"seconds":1.1000000000000001} »
        // The decimal separator should not be "," but "."
        print(json)
    }
}catch{
    print("\(error)")
}
 
exit(EX_OK)


Fix Proposal : 

 in swift-corelibs-foundation https://github.com/benoit-pereira-da-silva/swift-corelibs-foundation/blob/7bf5fc770471bcc6f9050cbdcd49492feccda2f2/Foundation/JSONSerialization.swift#L308 <https://github.com/benoit-pereira-da-silva/swift-corelibs-foundation/blob/7bf5fc770471bcc6f9050cbdcd49492feccda2f2/Foundation/JSONSerialization.swift#L308>
In `JSONSerialization.swift` line 308  may be should we specify  `kCFNumberFormatterDecimalSeparator` ? 
Adding :  CFNumberFormatterSetProperty(formatter, kCFNumberFormatterDecimalSeparator,CFSTR("."))

    private lazy var _numberformatter: CFNumberFormatter = {
        let formatter: CFNumberFormatter
        formatter = CFNumberFormatterCreate(nil, CFLocaleCopyCurrent(), kCFNumberFormatterNoStyle)
        CFNumberFormatterSetProperty(formatter, kCFNumberFormatterMaxFractionDigits, NSNumber(value: 15))
        CFNumberFormatterSetProperty(formatter, kCFNumberFormatterDecimalSeparator,CFSTR("."))
        CFNumberFormatterSetFormat(formatter, "0.###############"._cfObject)
        return formatter
    }()


I would like to propose my fix, test it and, but i’m not mastering the contribution mechanism.

Where should i start? 

I ve forked swift-corelibs-foundation <https://github.com/benoit-pereira-da-silva/swift-corelibs-foundation/blob/7bf5fc770471bcc6f9050cbdcd49492feccda2f2/Foundation/JSONSerialization.swift#L308>
How can i test my fix? 




Thanks



Benoit Pereira da Silva
Ultra Mobile Developer & Movement Activist
Développeur Ultra Mobile & Militant du mouvement
https://pereira-da-silva.com <https://pereira-da-silva.com/>





✄ --------------------------------
This e-mail is confidential. Distribution, copy, publication or use of this information for any purpose is prohibited without agreement of the sender.
Ce message est confidentiel. Toute distribution, copie, publication ou usage des informations contenues dans ce message sont interdits sans agrément préalable de l'expéditeur.



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20171218/e463c74e/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bannerp.jpg
Type: image/jpeg
Size: 27829 bytes
Desc: not available
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20171218/e463c74e/attachment.jpg>


More information about the swift-users mailing list