From f6e3a3c911d066bad4cc9cd8ddc72259bdec2c4c Mon Sep 17 00:00:00 2001 From: Matthew Purland Date: Mon, 25 Jan 2016 12:06:12 -0800 Subject: [PATCH 1/2] Fixed JSONDecoder for array and object types when using JSONValue encodeEither. --- Tyro/JSONValue.swift | 4 ++-- TyroTests/EncoderSpec.swift | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/Tyro/JSONValue.swift b/Tyro/JSONValue.swift index 6fca99f..203a072 100644 --- a/Tyro/JSONValue.swift +++ b/Tyro/JSONValue.swift @@ -109,8 +109,8 @@ extension JSONValue : JSONValueable { public var anyObject : AnyObject? { switch self { - case .Array(let values): return values as? AnyObject - case .Object(let value): return value as? AnyObject + case .Array(let values): return values.mapMaybe { $0.anyObject } + case .Object(let value): return value.mapMaybe { $0.anyObject } case .String(let s): return s case .Number(let n): return n case .Null: return NSNull() diff --git a/TyroTests/EncoderSpec.swift b/TyroTests/EncoderSpec.swift index bb7576c..e137e9e 100644 --- a/TyroTests/EncoderSpec.swift +++ b/TyroTests/EncoderSpec.swift @@ -16,6 +16,9 @@ class EncoderSpec : XCTestCase { let result = JSONEncoder.encoder.encodeEither(array) XCTAssertNotNil(result) XCTAssert(result.right == JSONValue.Array([.String("a"), .String("b"), .String("c")])) + let jsonString = result.right!.toJSONString()! + print("testEncodeArray: \(jsonString)") + XCTAssertEqual("[\"a\",\"b\",\"c\"]", jsonString) } func testEncodeObject() { @@ -23,6 +26,9 @@ class EncoderSpec : XCTestCase { let result = JSONEncoder.encoder.encodeEither(object) XCTAssertNotNil(result) XCTAssert(result.right == JSONValue.Object(["key": .String("value")])) + let jsonString = result.right!.toJSONString()! + print("testEncodeObject: \(jsonString)") + XCTAssertEqual("{\"key\":\"value\"}", jsonString) } func testEncodeString() { @@ -39,6 +45,27 @@ class EncoderSpec : XCTestCase { XCTAssert(result.right == .Number(number)) } + func testEncodeEmbeddedObjects() { + let object = ["number": 42, "array": [1, 2, 3], "object": ["strings": ["1", "2", "3"], "pi": 3.14159], "string": "hello"] + let result = JSONEncoder.encoder.encodeEither(object) + XCTAssertNotNil(result) + + switch result.right! { + case .Object(let v): + XCTAssert(result.right == .Object(v)) + XCTAssert(v["number"] == .Number(42)) + XCTAssert(v["string"] == .String("hello")) + XCTAssert(v["array"] == .Array([.Number(1), .Number(2), .Number(3)])) + XCTAssert(v["object"] == .Object(["strings": .Array([.String("1"), .String("2"), .String("3")]), "pi": .Number(3.14159)])) + let jsonString = result.right!.toJSONString()! + print("testEncodeEmbeddedObjects: \(jsonString)") + let expectedJson = "{\"array\":[1,2,3],\"object\":{\"strings\":[\"1\",\"2\",\"3\"],\"pi\":3.14159},\"number\":42,\"string\":\"hello\"}" + XCTAssertEqual(expectedJson, jsonString) + default: + XCTFail("Could not encode to JSONValue.Object") + } + } + func testEncodeError() { let result = JSONEncoder.encoder.encodeEither(JSONEncoder.encoder) XCTAssertNotNil(result) From 00c6fa281fce8d1050a69a84e5b2ec1953be2a47 Mon Sep 17 00:00:00 2001 From: Matthew Purland Date: Mon, 25 Jan 2016 12:23:45 -0800 Subject: [PATCH 2/2] Fixed test to ensure decoded json string matches original value. --- TyroTests/EncoderSpec.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/TyroTests/EncoderSpec.swift b/TyroTests/EncoderSpec.swift index e137e9e..5e2b1d1 100644 --- a/TyroTests/EncoderSpec.swift +++ b/TyroTests/EncoderSpec.swift @@ -58,9 +58,10 @@ class EncoderSpec : XCTestCase { XCTAssert(v["array"] == .Array([.Number(1), .Number(2), .Number(3)])) XCTAssert(v["object"] == .Object(["strings": .Array([.String("1"), .String("2"), .String("3")]), "pi": .Number(3.14159)])) let jsonString = result.right!.toJSONString()! - print("testEncodeEmbeddedObjects: \(jsonString)") - let expectedJson = "{\"array\":[1,2,3],\"object\":{\"strings\":[\"1\",\"2\",\"3\"],\"pi\":3.14159},\"number\":42,\"string\":\"hello\"}" - XCTAssertEqual(expectedJson, jsonString) + + // Ensure the decoded json string matches the original encoded value + let decodedValueFromJson = JSONValue.decodeEither(jsonString).right! + XCTAssertEqual(decodedValueFromJson, result.right!) default: XCTFail("Could not encode to JSONValue.Object") }