1

我想要以下 JSON 结构(假示例):

{
    "Admin" : 
    {
        "name" : "John",
        "age" : "42"
    },
    "Sales" : 
    {
        "name" : "John",
        "age" : "42"
    },
    "CEO" : 
    {
        "name" : "Peter",
        "age" : "52",
        "salary" : "100000"
    },
    "Janitor" : 
    {
        "name" : "Matthew",
        "age" : "22"
    }
}

如您所见,结构如果确定,但结构的名称是动态的。

如何将其转换为 Swift Codable 结构?当前尝试:

struct Positions: Codable
{
    var posDicts: [String: Position] = [:]
}

struct Position: Codable
{
    let name: String
    let age: Int
    let salary: Int?
}

但是,这将给出以下结果:

"posDicts" : {
    "Admin" : 
    {
        "name" : "John",
        "age" : "42"
    },
    "Sales" : 
    {
        "name" : "John",
        "age" : "42"
    },
    "CEO" : 
    {
        "name" : "Peter",
        "age" : "52",
        "salary" : "100000"
    },
    "Janitor" : 
    {
        "name" : "Matthew",
        "age" : "22"
    }
}

我不想要 JSON 中的“posDicts”。什么是最好/最简单的解决方案?

PS:有关使用动态键可解码 Swift Codable 的相关问题

4

3 回答 3

2

而不是解码

let result = try JSONDecoder().decode(Positions.self, from: data)

删除Positions结构并解码

let result = try JSONDecoder().decode([String:Position].self, from: data)

要对字典进行相应的编码,请将其声明为

 var positions = [String:Position]()
于 2018-12-11T17:59:31.293 回答
0

目前似乎不支持使用动态键进行编码。

我使用了字典而不是需要动态键的可编码模型。

let dict = [dynamicKey: dynamicValue]
class MyModel: Encodable {
      someModelKey: dict
}
于 2021-09-24T01:54:07.220 回答
0

Vadian 的回答是朝着正确的方向迈出了一大步。解决方案是对字典进行编码,而不是对包含字典的结构进行编码。

由于最初的问题是关于编码,以下是一个完整的解决方案:

var positions: [String: Position] = [:]
let json = try? encoder.encode(positions)
于 2018-12-11T18:13:44.143 回答