【问题标题】:Swift 4 - Accessing Generic Json Object for Codable StructSwift 4 - 访问可编码结构的通用 Json 对象
【发布时间】:2018-12-03 19:53:56
【问题描述】:

我的 API 总是返回具有以下结构的 Json:

{
    "data": Object
}

其中“对象”可以是原始数据(例如字符串)、另一个 Json 对象或 Json 数组。

{
    "data": "string"
}

{
    "data": {
       "id_user": 1
       "name": "name"
    }
}

{
    "data": [{
       "id_user": 1
       "name": "name"
    },
    {
       "id_user": 2
       "name": "name"
    }]
}

如何访问“对象”以便使用 Codable 结构对其进行解析?

【问题讨论】:

  • 越灵活,需要编写的代码就越多。在处理案例的封闭结构中编写自定义初始化程序。
  • @vadian 怎么样?我可以为 Object 变量使用哪些类型?
  • 如果id_user / name 结构始终相同,则创建Decodable 结构(例如User),情况为String、User 和[User] 键data .
  • 我不能这样做,因为我可以有很多可能的结构,这就是为什么我需要一个泛型类型来访问“数据”内容,然后使用 JSONDecoder 解析它
  • Encodable / Decodable 的通用行为只与它支持的具体类型有关。您无法解码不是从受支持的泛型类型之一派生的泛型类型

标签: json swift parsing swift4


【解决方案1】:

好的,我找到了一个解决方案,使用字典。通过这种方式,我可以访问“数据”内容,将其转换为 Data,然后使用 Codable 对其进行解析。代码如下:

let json = try JSONSerialization.jsonObject(with: response.data!, options: []) as! [String: Any]
guard let dataKey = json["data"] else {
    throw CustomError.dataNotFound
}
let jsonData = try JSONSerialization.data(withJSONObject: dataKey, options: [])
let result = try JSONDecoder().decode(CodableStruct.self, from: jsonData)

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2019-03-13
    • 2018-04-08
    相关资源
    最近更新 更多