Skip to content

Commit 504ebf9

Browse files
Pushkar N Kulkarniparkera
Pushkar N Kulkarni
authored andcommitted
Cherry-pick NSJSONSerialization fixes for 3.0.1 (#674)
* [SR-2694] Cannot serialize JSON object with array (#648) * Support JSONSerialization of more number types (#650)
1 parent 0708137 commit 504ebf9

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

Foundation/NSJSONSerialization.swift

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ open class JSONSerialization : NSObject {
6161
}
6262

6363
// object is NSNumber and is not NaN or infinity
64-
if let number = obj as? NSNumber {
64+
if let number = _SwiftValue.store(obj) as? NSNumber {
6565
let invalid = number.doubleValue.isInfinite || number.doubleValue.isNaN
6666
return !invalid
6767
}
@@ -273,18 +273,16 @@ private struct JSONWriter {
273273

274274
if let str = obj as? String {
275275
try serializeString(str)
276-
} else if let num = obj as? Int {
277-
try serializeNumber(NSNumber(value: num))
278-
} else if let num = obj as? Double {
279-
try serializeNumber(NSNumber(value: num))
280-
} else if let num = obj as? NSNumber {
276+
} else if let num = _SwiftValue.store(obj) as? NSNumber {
281277
try serializeNumber(num)
282278
} else if let array = obj as? Array<Any> {
283279
try serializeArray(array)
284280
} else if let dict = obj as? Dictionary<AnyHashable, Any> {
285281
try serializeDictionary(dict)
286282
} else if let null = obj as? NSNull {
287283
try serializeNull(null)
284+
} else if let boolVal = obj as? Bool {
285+
try serializeNumber(NSNumber(value: boolVal))
288286
}
289287
else {
290288
throw NSError(domain: NSCocoaErrorDomain, code: CocoaError.propertyListReadCorrupt.rawValue, userInfo: ["NSDebugDescription" : "Invalid object cannot be serialized"])

TestFoundation/TestNSJSONSerialization.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,7 @@ extension TestNSJSONSerialization {
597597
("test_jsonObjectToOutputStreamFile", test_jsonObjectToOutputStreamFile),
598598
("test_invalidJsonObjectToStreamBuffer", test_invalidJsonObjectToStreamBuffer),
599599
("test_jsonObjectToOutputStreamInsufficeintBuffer", test_jsonObjectToOutputStreamInsufficeintBuffer),
600+
("test_booleanJSONObject", test_booleanJSONObject),
600601
]
601602
}
602603

@@ -928,6 +929,16 @@ extension TestNSJSONSerialization {
928929
XCTAssertThrowsError(try JSONSerialization.writeJSONObject(str, toStream: outputStream, options: []))
929930
}
930931

932+
func test_booleanJSONObject() {
933+
do {
934+
let mydata = try JSONSerialization.data(withJSONObject: [true])
935+
XCTAssertEqual(String(data: mydata, encoding: String.Encoding.utf8), "[1]")
936+
} catch {
937+
XCTFail("Failed during serialization")
938+
}
939+
XCTAssertTrue(JSONSerialization.isValidJSONObject([1]))
940+
}
941+
931942
private func createTestFile(_ path: String,_contents: Data) -> String? {
932943
let tempDir = "/tmp/TestFoundation_Playground_" + NSUUID().uuidString + "/"
933944
do {

0 commit comments

Comments
 (0)