Swift 如何使用codable为这个json创建模型

Swift 如何使用codable为这个json创建模型,swift,codable,Swift,Codable,我有下面的json,我想用codable为json创建模型 { id = 1; name = "abc"; empDetails = { data = [{ address = "xyz"; ratings = 2; "empId" = 6; "empName" = "def"; }]; }; } 模型 我不需要钥匙数据。我想将data的值设置为empDetails属性 如何使用in

我有下面的json,我想用codable为json创建模型

{
    id = 1;
    name = "abc";
    empDetails = {
    data = [{
        address = "xyz";
        ratings = 2;
        "empId" = 6;
        "empName" = "def";
    }];
    };
}
模型

我不需要钥匙
数据
。我想将
data
的值设置为
empDetails
属性


如何使用
init(from decoder:decoder)抛出
方法来实现这一点?

只需创建
枚举编码键
,并在
结构根中实现
init(from:)
即可实现该功能

struct Root: Decodable {
    let id: Int
    let name: String
    let empDetails: [Emp]

    enum CodingKeys: String, CodingKey {
        case id, name, empDetails, data
    }

    struct Emp: Codable {
        let address: String
        let ratings: Int
        let empId: Int
        let empName: String
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(Int.self, forKey: .id)
        name = try container.decode(String.self, forKey: .name)
        let details = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .empDetails)
        empDetails = try details.decode([Emp].self, forKey: .data)
    }
}

谢谢你的回答。但是检查一下我的乔森。它里面有
empDetails
键和
data
键。我想你的答案不会work@iOSDev对不起,误会了。我已经按照要求更新了答案。它有效。如果我们使用custom
init
方法,我们就不能在
init
方法中使用one属性
empDetails
。如果我从
init
方法中注释
id=…
name=…
,则从初始值设定项返回,但未初始化所有存储的属性。请看一看。@vadian我想您不明白我的问题。我有json格式的
empDetails->data
。我不希望该数据出现在我的结构中。@vadian在我的json类型的
empDetails
中是
[String:Any]
,而
数据的类型是
[[String:Any]]
。我可以使用
Root->EmpDetails->Data->[Emp]
创建嵌套结构。在这里,我想避免我的struct@vadian好啊我会检查的
struct Root: Decodable {
    let id: Int
    let name: String
    let empDetails: [Emp]

    enum CodingKeys: String, CodingKey {
        case id, name, empDetails, data
    }

    struct Emp: Codable {
        let address: String
        let ratings: Int
        let empId: Int
        let empName: String
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(Int.self, forKey: .id)
        name = try container.decode(String.self, forKey: .name)
        let details = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .empDetails)
        empDetails = try details.decode([Emp].self, forKey: .data)
    }
}