Swift Codable:使用未知键解码字典

2024-03-15

Codable当您了解 JSON 数据的关键格式时,这会非常有用。但是如果您不知道密钥怎么办?我目前面临这个问题。

通常我希望 JSON 数据像这样返回:

{
"id": "<123>",
"data": [
    {
        "id": "<id1>",
        "event": "<event_type>",
        "date": "<date>"
    },
    {
        "id": "<id2>",
        "event": "<event_type>",
        "date": "<date>"
    },
]
}

但这就是我想要解码的:

{
"id": "123",
"data": [
    { "<id1>": { "<event>": "<date>" } },
    { "<id2>": { "<event>": "<date>" } },
]
}

问题是:我该如何使用Codable解码 JSON,其中键是唯一的?我觉得我错过了一些明显的东西。

这就是我希望做的,这样我就可以使用Codable:

struct SampleModel: Codable {
    let id: String
    let data: [[String: [String: Any]]]

    // MARK: - Decoding

    enum CodingKeys: String, CodingKey {
        case id = "id"
        case data = "data"
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)

        id = try container.decode(String.self, forKey: .id)
        // This throws an error: Ambiguous reference to member 'decode(_:forKey:)'
        data = try container.decode([[String: [String: Any]]].self, forKey: .data)
    }
}

这会引发错误:Ambiguous reference to member 'decode(_:forKey:)'


对于你完全改变的问题,解决方案非常相似。您的结构只是在数组上方添加了一层。不需要任何自定义解码,甚至不需要任何 CodingKey。

请注意,您不能使用Any在可编码中。

let json="""
{
"id": "123",
"data": [
    { "<id1>": { "<event>": "2019-05-21T16:15:34-0400" } },
    { "<id2>": { "<event>": "2019-07-01T12:15:34-0400" } },
]
}
"""
struct SampleModel: Codable {
    let id: String
    let data: [[String: [String: Date]]]
}

var decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
    let res = try decoder.decode(SampleModel.self, from: json.data(using: .utf8)!)
    print(res)
} catch {
    print(error)
}

您原来问题的原始答案。

由于您有一个嵌套字典数组,其中没有固定字典键,并且由于没有其他字段,因此您可以将其解码为普通数组。

这是一个例子:

let json="""
[
    { "<id1>": { "<event>": "2019-07-01T12:15:34-0400" } },
    { "<id2>": { "<event>": "2019-05-21T17:15:34-0400" } },
]
"""
var decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
do {
    let res = try decoder.decode([[String: [String: Date]]].self, from: json.data(using: .utf8)!)
    print(res)
} catch {
    print(error)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift Codable:使用未知键解码字典 的相关文章

随机推荐

  • 使用状态变量作为 SwiftUI 中函数的输入

    我有两个文本字段 用于更改两个 State 变量 即startingMileage 和endingMileage 的值 以及一个步进器 用于更改名为fuelAdded 的第三个 State 变量的值 我正在尝试使用用户的输入并进行计算来计算
  • 圆角后可成形图像视图上的黑色边缘

    After rounding the edges on my shapeable image view I still get black edges around the rounded edges 这是我的 xml
  • 如何使画布轮廓成为透明 png 以实现悬停发光

    是否可以自动为图像提供发光效果 例如使用画布 jsfiddle http jsfiddle net LAS8L 88 canvas 标签必须省略透明 并使其具有外发光
  • 如何在流畅的nhibernate中将复合主键映射到外国?

    我有以下表格 table A FOO PK CLIENT PK table B BAR PK CLIENT PK FK FOO FK PK gt 主键 FK gt 外键 A 和 B 之间存在一对多关系 我不能简单地这样做 class AMa
  • Flutter - 自定义按钮点击区域

    我正在构建一个 Flutter 应用程序 其中屏幕的很大一部分将被圆形按钮占据 我已经尝试了几种不同的方法来创建圆形按钮 但我总是遇到同样的问题 可点击 区域实际上不是圆形的 而是矩形的 这是一个使用以下方法获得的示例FloatingAct
  • 按任意键对元组列表进行排序

    order w x a z object a object x object z object a object w 如何根据 order 提供的键列表按第二个元素对上面的元组列表进行排序 2013 年 11 月 18 日更新 我发现了一个
  • 将值加载到 Selectize.js 中

    Problem 我有一个文本输入 我选择它作为标签 它可以很好地查询远程数据 我可以使用它搜索甚至创建新项目 并且一切正常 使用选择 var select authorsearch selectize valueField AuthorId
  • 使用 JavaScript 切换 CSS 类 - 错误

    我正在尝试制作一个脚本 当用户单击具有 burger nav img 类的图像时 它会在另一个元素中切换 open 类 我的代码是 HTML
  • Swing - 使用 getComponent() 更新所有 JButton

    我正在制作一个井字棋游戏 其中每个棋盘都由一个 JButton 代表 当有人单击该按钮时 文本将更改为 X 或 O 我正在编写一个重置函数 它将所有按钮中的文本重置为 我正在使用 getComponents 方法访问数组中的所有按钮 我只是
  • 为 GridView 的 PagerTemplate 动态生成页面链接按钮

    从 MSDN 页面获取PagerTemplate of the GridView控制 强调我的 通常 按钮控制添加到寻呼机模板中以执行寻呼操作 当单击 CommandName 属性设置为 Page 的按钮控件时 GridView 控件将执行
  • 是否可以在不使用 ApplicationContextAware 的情况下检索具有原型范围的 Spring bean

    使用Spring 3 1 如果我想检索具有原型范围的 bean 即我每次都想要该类的不同实例 是否可以在不使用 ApplicationContextaware 类的情况下检索该 bean 这就是我目前的做法 Component Qualif
  • ModuleNotFoundError:没有名为“建模”的模块

    我对深度学习和 python 非常陌生 我正在尝试重新创建该项目https github com Nagakiran1 Extending Google BERT as Question and Answering model and Ch
  • 能否阻止单个应用程序的 Microsoft 错误报告?

    我们有一个非托管 C 应用程序 它利用第 3 方 API 来读取 CAD 文件 对于某些损坏的 CAD 文件 第 3 方库崩溃并导致我们的 EXE 崩溃 因此 我们的主应用程序是一个单独的 EXE 这样它就不会受到崩溃的影响 然而 我们最终
  • 使用 java POI 插入表时 Open Office writer 崩溃

    我正在尝试使用 open office 使用 apache poi 以 docx 格式插入表 但是每次打开文件时文件都会崩溃 XWPFDocument document new XWPFDocument FileOutputStream o
  • 单击浏览器的后退按钮时重定向到特定页面

    这是一个有点菜鸟的问题 但事实就是这样 我有一个网站 用户只能通过下一页和后退按钮从一个页面导航到另一个页面 即有一个用户必须遵循的向导 向导的一部分包含不同的页面 一部分包含相同的页面但具有更改的 div 但从用户体验来看 它是不同的页面
  • Stream_Copy_To_Stream() 的替代方案 php

    我现在正在开发一个文件共享网站 遇到了一个小问题 我正在使用上传脚本 uploadify 它工作得很好 但如果用户想要 我希望上传的文件被加密 现在我有可以执行此操作的工作代码 如下所示 但我的服务器只有 1GB 或内存 并且使用strea
  • 如何在 WooCommerce 3+ 中进行调试

    我正在使用本教程为 Woocommerce 创建自定义运输方法https docs woocommerce com document shipping method api https docs woocommerce com docume
  • 如何“重置”给定 HTML 元素的样式?

    我正在开发一个可嵌入的 javascript 它将 HTML 元素插入未知页面 我无法控制要插入 HTML 的页面的样式表 问题是我插入的 HTML 会被页面错误地风格化 我想防止这种情况发生 确保我插入的元素是最不冗长和 或资源密集的ex
  • 使用 pd.read_clipboard 复制多索引数据帧?

    Given a 像这样的数据框 https stackoverflow com questions 17921010 how to query multiindex index columns values in pandas C A B
  • Swift Codable:使用未知键解码字典

    Codable当您了解 JSON 数据的关键格式时 这会非常有用 但是如果您不知道密钥怎么办 我目前面临这个问题 通常我希望 JSON 数据像这样返回 id lt 123 gt data id