代码之家  ›  专栏  ›  技术社区  ›  user1107173

Swift Codable:如果API将来可能会为响应JSON添加更多属性,则包含枚举编码键

  •  0
  • user1107173  · 技术社区  · 5 年前

    我在用 Codable 解析我的 JSON 响应对象。

    包括在内是个好主意吗 enum CodingKeys: String, CodingKey 所以未来如果 JSON 响应对象添加了额外的属性,它们将被忽略,不会导致崩溃?

    当应用程序中有30种不同的型号时,需要回填的代码太多了。

    不确定是否有更好的方法来处理这个问题?

    2 回复  |  直到 5 年前
        1
  •  1
  •   Joakim Danielson    5 年前

    下面是一个运行良好的示例,它证明了未在结构中定义的额外json键将被忽略

    let data = """
     { "id": 32, "name" : "abc", "other": "gbdfb"}
    """.data(using: .utf8)!
    
    struct JSONData: Decodable {
        let id: Int
        let name: String
    }
    
    
    do {
        let result = try JSONDecoder().decode(JSONData.self, from: data)
        print(result)
    } catch {
        print(error)
    }
    
        2
  •  1
  •   Ankur Lahiry    5 年前

    答案是 No 这个 Codable 仅解码在中找到的值 json .此外,如果您添加 enum CodingKeys: String, CodingKey 每个人 可编码 协议您可以将其保留为空值。

    我们过去常常写作 枚举编码键:字符串,编码键 如果钥匙没有被蛇咬。但是Codable有自己的 keyDecodingStrategy

    
    let jsonString = """
    [
        {
            "profile_name": "Ankur Lahiry",
        },
        {
            "profile_name": "Karim Rahman",
        }
    ]
    """
    
    let jsonData = Data(jsonString.utf8)
    
    
    struct Name : Codable {
        var profileName: String?
    }
    
    
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase // will solve enum CodingKeys: String, CodingKey issue 
    do {
        let names = try decoder.decode([Name].self, from: jsonData)
        print(names)
    } catch {
        print("error")
    }