【问题标题】:Swift Codable: encode structure with dynamic keysSwift Codable:使用动态键编码结构
【发布时间】:2019-05-12 18:13:57
【问题描述】:

我想要以下 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”。 什么是最好/最简单的解决方案?

P.S.:关于可解码Swift Codable with dynamic keys的相关问题

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/50713638/…
  • @emrepun 您可能已经注意到,这与我在问题中提供的链接完全相同。 (iow:需要更多)
  • 抱歉没听清楚:/
  • 可能发生,别担心:D

标签: swift codable encodable


【解决方案1】:

而不是解码

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

删除Positions 结构并解码

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

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

 var positions = [String:Position]()

【讨论】:

    【解决方案2】:

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

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

    var positions: [String: Position] = [:]
    let json = try? encoder.encode(positions)
    

    【讨论】:

      【解决方案3】:

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

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

      let dict = [dynamicKey: dynamicValue]
      class MyModel: Encodable {
            someModelKey: dict
      }
      

      【讨论】:

        猜你喜欢
        • 2021-05-24
        • 2020-07-28
        • 2021-07-06
        • 2018-11-15
        • 2018-10-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多