diff --git a/Sources/XXClient/Models/Fact.swift b/Sources/XXClient/Models/Fact.swift index 99db6a2a9cd65262fba3b0ce82f3565136c9b356..2ee8a6b3a87720869aafc10e4c746ebcc2565c55 100644 --- a/Sources/XXClient/Models/Fact.swift +++ b/Sources/XXClient/Models/Fact.swift @@ -30,10 +30,16 @@ extension Fact: Codable { extension Array where Element == Fact { public static func decode(_ data: Data) throws -> Self { - try JSONDecoder().decode(Self.self, from: data) + if let string = String(data: data, encoding: .utf8), string == "null" { + return [] + } + return try JSONDecoder().decode(Self.self, from: data) } public func encode() throws -> Data { - try JSONEncoder().encode(self) + if isEmpty { + return "null".data(using: .utf8)! + } + return try JSONEncoder().encode(self) } } diff --git a/Tests/XXClientTests/Models/FactTests.swift b/Tests/XXClientTests/Models/FactTests.swift index 2ba1da9ac9da82e174cee504e8708bb6794e9a81..c844af66f73b6e4686e51436f49d8a28a1c79568 100644 --- a/Tests/XXClientTests/Models/FactTests.swift +++ b/Tests/XXClientTests/Models/FactTests.swift @@ -38,4 +38,17 @@ final class FactTests: XCTestCase { XCTAssertNoDifference(models, decodedModels) } + + func testCodingEmptyArray() throws { + let jsonString = "null" + let jsonData = jsonString.data(using: .utf8)! + + let decodedModels = try [Fact].decode(jsonData) + + XCTAssertNoDifference(decodedModels, []) + + let encodedModels = try decodedModels.encode() + + XCTAssertNoDifference(encodedModels, jsonData) + } }