JSON的值可以是数组和对象

JSON的值可以是数组和对象,json,swift,Json,Swift,我向服务器发出HTTP请求并接收JSON文档。 我使用以下结构来解码JSON: struct DocumenJSON: Codable { let code: Int? let description: String? let value: Value? } 问题在于,发出请求“a”会收到一个对象值,而发出请求“B”则是一个值数组,因此结构应该如下所示: struct DocumenJSONArray: Codable { let code: Int?

我向服务器发出HTTP请求并接收JSON文档。 我使用以下结构来解码JSON:

struct DocumenJSON: Codable {
    let code: Int?
    let description: String?
    let value: Value?
}
问题在于,发出请求“a”会收到一个对象值,而发出请求“B”则是一个值数组,因此结构应该如下所示:

struct DocumenJSONArray: Codable {
    let code: Int?
    let description: String?
    let value: [Value]?
}
如何在swift 4中实现这一点,而无需重复代码

            } catch let jsonErr {
                print("Error serializing json:", jsonErr)
                do {
                document = try JSONDecoder().decode(DocumenJSON.self, from: data)
                user = User.init(password: "", email: document?.value?.email ?? "Empty", givenNames: document?.value?.nickname ?? "Empty", familyName: document?.value?.lastname ?? "Empty", phone: document?.value?.nickname   ?? "Empty")
                } catch let jsonErr2 {
                    print("Error serializing json2:", jsonErr2)
                }
            }

一种可能的解决方案是使用单个结构,例如:

extension DocumenJSON: Decodable {
    enum CodingKeys: String, CodingKey {
        case code
        case description
        case valueAsObject
        case valueAsArray
    }
    init(from decoder: Decoder) throws {
        let values = try decoder.container(keyedBy: CodingKeys.self)
        code = try values.decodeIfPresent(Int.self, forKey: .code)
        description = try values.decodeIfPresent(String.self, forKey: .description)
        valueAsObject = try values.decodeIfPresent(Value.self, forKey: .valueAsObject)
        valueAsArray = try values.decodeIfPresent(Array.self, forKey: .valueAsArray)
    }
}
现在,无论何时调用
DocumenJSON
只需检查valueAsObject或valueAsArray为零的每个属性


可能不是最漂亮的解决方案,但至少你没有重复结构

你必须编写一个自定义的初始值设定项来处理这些情况。decodeIfpresent在initI中我不知道你说的@vadian是什么意思。你能给我举个例子吗?这里也有同样的问题:?@Sh_Khan
decodeIfPresent
无效,因为两种情况下钥匙都存在。