Swift 4 Decodable:嵌套数组的结构

2023-12-31

鉴于以下 JSON 文档,我想创建一个struct有四个属性:filmCount (Int), year (Int), category(字符串),以及actor(演员阵列)。

{    
    "filmCount": 5,
    "year": 2018,
    "category": "Other",
    "actors":{  
        "nodes":[  
            {  
                "actor":{  
                    "id":0,
                    "name":"Daniel Craig"
                }
            },
            {  
                "actor":{  
                    "id":1,
                    "name":"Naomie Harris"
                }
            },
            {  
                "actor":{  
                    "id":2,
                    "name":"Rowan Atkinson"
                }
            }
        ]
    }
}

PlacerholderData是一个结构体,存储三个主要属性和应从嵌套中检索的参与者列表nodes容器内的actors来自 JSON 对象的属性。

占位符数据:

struct PlaceholderData: Codable {
    let filmCount: Int
    let year: Int
    let category: String
    let actors: [Actor]
}

演员.斯威夫特:

struct Actor: Codable {
    let id: Int
    let name: String
}

我试图通过提供我自己的init手动初始化解码器容器中的值。我怎样才能解决这个问题,而不必有一个中间结构来存储nodes object?


您可以使用嵌套容器(keyedBy:) and 嵌套UnkeyedContainer(forKey:)用于解码像这样的嵌套数组和字典,将其转换为您想要的结构。你的解码在初始化(解码器:)可能看起来像这样,

用于解码的 Actor 扩展,

extension Actor: Decodable {

    enum CodingKeys: CodingKey { case id, name }

    enum ActorKey: CodingKey { case actor }

    init(from decoder: Decoder) throws {
        let rootKeys        = try decoder.container(keyedBy: ActorKey.self)
        let actorContainer  = try rootKeys.nestedContainer(keyedBy: CodingKeys.self,
                                                           forKey: .actor)
        try id =  actorContainer.decode(Int.self,
                                       forKey: .id)
        try name =  actorContainer.decode(String.self,
                                         forKey: .name)
    }
}

用于解码的 PlaceholderData 扩展,

extension PlaceholderData: Decodable {

    enum CodingKeys: CodingKey { case filmCount, year, category, actors }

    enum NodeKeys: CodingKey { case nodes }

    init(from decoder: Decoder) throws {
        let rootContainer   = try decoder.container(keyedBy: CodingKeys.self)
        try filmCount       =  rootContainer.decode(Int.self,
                                                    forKey: .filmCount)
        try year            =  rootContainer.decode(Int.self,
                                                    forKey: .year)
        try category        =  rootContainer.decode(String.self,
                                                    forKey: .category)
        let actorsNode      = try rootContainer.nestedContainer(keyedBy: NodeKeys.self,
                                                                forKey: .actors)
        var nodes = try actorsNode.nestedUnkeyedContainer(forKey: .nodes)
        var allActors: [Actor] = []

        while !nodes.isAtEnd {
            let actor = try nodes.decode(Actor.self)
            allActors += [actor]
        }
        actors = allActors
    }
}

然后,你可以像这样解码它,

let decoder = JSONDecoder()
do {
    let placeholder = try decoder.decode(PlaceholderData.self, from: jsonData)
    print(placeholder)
} catch {
    print(error)
}

这里,基本思想是使用解码字典容器嵌套容器(keyedBy:)和数组容器使用嵌套UnkeyedContainer(forKey:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swift 4 Decodable:嵌套数组的结构 的相关文章

  • Xcode 8 beta“错误”对于这种情况下的类型查找不明确

    根据这篇文章 我需要指定模块来查找对象类型 在此上下文中 方法 对于类型查找不明确 Alamofire 中的错误 https stackoverflow com questions 33543597 method is ambiguous
  • 扩展可能不包含存储的属性,但为什么允许静态

    扩展不能包含存储属性 但是为什么扩展中可以定义静态存储属性呢 我也没有找到任何文档提到扩展中允许静态属性 extension String static let test Test static var test2 Test2 扩展名不能包
  • 使用 JQuery 定义要附加的 HTML 模板

    我有一个正在循环的数组 每次条件成立时 我想附加一份副本HTML下面的代码到具有一些值的容器元素 我可以在哪里放置此 HTML 以以智能方式重复使用 a href class list group item div class image
  • 转换 JSON-JSON JOLT

    我对 JOLT 还很陌生 我需要将 JSON 文件转换为所需的架构 这是我的输入 PK 12345 FULL NAME Amit Prakash BIRTHDATE 1987 05 25 SEX M EMAIL email protecte
  • 应用程序内的 SQLite 文件版本兼容性

    我有一个 C NET 应用程序 一种复杂的计算应用程序 其中用户输入数据 处理后的信息使用 JSON 序列化和 EF 保存到 SQLite 文件中 需要时可以将其加载到我们的应用程序中 应用程序在开发过程中经历了很多变化 类也被修改 因此
  • 在 Swift 中获取 UIImage 的主颜色

    我正在尝试在 Swift 中获取 UIImage 的主颜色 并尝试移植这段代码 https stackoverflow com questions 13694618 objective c getting least used and mo
  • 如何从 GCD (DispatchQueue) 转换为 Swift async/await?

    我正在关注斯坦福大学的 CS193p 开发 iOS 应用程序在线课程 它使用 Grand Central Dispatch GCD API 来演示多线程 但他们指出 自 WWDC 2021 起 GCD 已大部分被 Swift 新的内置异步
  • 使用 YAML.load 解析 json 安全吗?

    我使用的是红宝石2 1 0 我有一个 json 文件 例如 测试 json item apple 1 banana 2 使用 YAML load 加载此文件是否安全 YAML load File read test json 我正在尝试加载
  • Swift - 本地通知不会被触发

    我正在 Swift 3 中编码 我只是想发送通知now没有任何延迟或间隔 然而 通知永远不会被触发 这是我的代码 视图控制器代码 import UserNotifications class HomeViewController UIVie
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • 如何在 Flask 中获取 POSTed JSON?

    我正在尝试使用 Flask 构建一个简单的 API 现在我想在其中读取一些 POSTed JSON 我使用 Postman Chrome 扩展进行 POST 我 POST 的 JSON 很简单 text lalala 我尝试使用以下方法读取
  • 从 appsettings.json 读取 JSON 对象

    TL DR 如何从 appsettings json 读取复杂的 JSON 对象 我有一个具有多种类型的配置值的 NET Core 2 x 应用程序 appsettings json看起来像下面的代码片段 我正在尝试读取的值ElasticS
  • 如何使 SFSpeechRecognizer 在 macOS 上可用?

    我正在尝试使用 Apple 的语音框架在 macOS 10 15 1 上进行语音识别 在 macOS 10 15 之前 语音识别仅在 iOS 上可用 但根据文档 https developer apple com documentation
  • 自动完成仅显示消息并且结果可用,使用向上和向下箭头键进行导航。而是显示列表

    我的问题很清楚 我正在使用 jquery 自动完成 我不知道为什么它只向我显示消息 9 results are available use up and down arrow keys to navigate 没有向我显示结果列表 这是我的
  • 使用 iOS 8 自定义键盘发送图像?

    我一直在为 iOS 8 开发自定义键盘 但在尝试使用键盘发送图像时偶然发现了一个问题 我做了一些研究 似乎没有一种简单的方法可以做到这一点UITextDocumentProxy因为只有NSStrings被允许 我是否忽略了使用自定义键盘发送
  • 当我输入字符时,SwiftUI 中的 TextField 失去焦点

    当我在文本字段中输入字符时遇到问题 在练习集视图 我必须重新单击文本框才能输入另一个字符 如果我从文本字段中删除绑定 我可以流畅地输入文本 我认为这与我的演讲者班级和更新集函数重新创建一个集合实例 因为我必须替换数组中两层深处的一些值 Co
  • GeoFire Swift 3 - 保存和更新坐标

    我正在尝试使用 GeoFire 将坐标存储到 Firebase 数据库中 我不确定如何更新新坐标 因为它们每秒都会更改 更新 随着childByAutoId 它正在为每辆自行车生成一个新的唯一 ID 如何引用这个唯一的自行车 ID 例如 用
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • SwiftUI:发送电子邮件

    在正常情况下UIViewController在 Swift 中 我使用此代码发送邮件 let mailComposeViewController configuredMailComposeViewController mailCompose

随机推荐

  • 函数参数的部分绑定

    有没有办法部分地绑定第一个 最后一个n可调用对象 例如函数 的参数而不显式指定其余参数 std bind 似乎需要这样all参数是绑定的 那些剩下的应该绑定到std placeholders 1 2 3 etc 是否可以写一个bind fi
  • Numpy 多维数组中索引的顺序

    例如 假设我正在模拟一堆粒子随着时间的推移做某事 并且我有一个名为的多维数组particles与这些索引 粒子的 x y z 坐标 长度a 即3对于 3d 空间 单个粒子的索引 长度b 其所在时间步长的索引 长度c 构建数组是否更好part
  • Ajax.BeginForm 让我抓狂

    ASP NET MVC3 我有一个最初在 div 内呈现的部分视图 以下是部分代码 model Venue Models Validation CustomerRequestModel Scripts jquery 1 4 4 min js
  • 如何使用 Jmeter Correlation 从下拉列表中选择随机帐户

    我在正则表达式的帮助下使用关联设计了我的脚本 这里我的场景是登录 进入产品搜索屏幕 随机选择一个帐户并选择产品模板并下订单 在这里 我通过为每个组选择提供的帐户来完成关联并为 5 个用户运行脚本 但我想为每个用户选择不同的帐户 第一次登录时
  • 如何为 H2OFrame 对象一次强制多个列为因子?

    我正在尝试遵循有关问题的建议 同时将多个列强制为因子 https stackoverflow com questions 33180058 coerce multiple columns to factors at once 但它不适用于H
  • WPF中如何发现ScrollViewer滚动到最后?

    我有一个ScrollViewer我的自定义控件中的实例 我需要 scorollview 是否滚动到末尾的要求 有什么办法吗 您可以通过以下方式检查 scrollViewer ScrollChanged OnScrollChanged pri
  • 在加载上下文中加载非托管静态 dll

    我有本机非托管 dll 它是静态的 如果我想并行运行它 每次需要库做一些工作时都必须加载它 在 NET 中 我会使用 AppDomain 并在需要时加载此 dll 但在 NET Core 中 AppDomain 已经消失 暂时 我查看了 A
  • 路由关注和多态模型:如何共享控制器和视图?

    给定路线 Example Application routes draw do concern commentable do resources comments end resources articles concerns commen
  • GeoPandas 中的格式/圆形数字图例标签

    我正在寻找一种方法来格式化 舍入这些地图中的数字图例标签 plot GeoPandas 中的函数 例如 gdf plot column pop2010 scheme QUANTILES k 4 这给了我一个有很多小数位的图例 我希望图例标签
  • 将应用程序渲染到主体时,语义 UI 侧边栏会使用 ReactJS 抛出控制台错误

    有什么方法可以在不使用 HTML 正文中的 id 标签的情况下将 Semantic UI 侧边栏渲染到 React 应用程序中 我想避免必须将 React 组件渲染到 HTML 正文中的 tagis 例如不使用 div div 我正在使用
  • 将 Scala 类作为参数传递?

    我希望将一个类作为参数传递给 Scala 函数 如下所示 def sampleFunc c Class List Any 附带问题 参数中的类型应该是 Class 还是 Class 我传递 Class 类型的原因是检查对象是否属于特定类型
  • 如何将 UIImageView 设置为圆角以适应宽高比模式

    我通常使用以下代码来设置圆角 imageView layer cornerRadius 10 当 imageView 设置为 Aspect Fill 时 它会起作用 但是当imageView设置为Aspect Fit模式时 imageVie
  • 在 Node.js 上使用 aes-ecb 加密二进制数据

    我尝试在 Node js 上进行加密 但糟糕的是我无法获得与在线网站相同的结果 我想用二进制密钥加密一些二进制数据 我使用教程节点站点 https nodejs org api crypto html crypto class cipher
  • nginx - 从上游服务器读取自定义标头

    我使用 nginx 作为反向代理 并尝试从上游服务器 Apache 的响应中读取自定义标头 但没有成功 Apache 的响应如下 HTTP 1 0 200 OK Date Fri 14 Sep 2012 20 18 29 GMT Serve
  • ListView 适配器和焦点状态

    我有一些列表视图 这是项目视图的代码
  • Matplotlib 图未使用 ipywidgets 滑块更新

    我有以下代码来生成一个简单的图表 matplotlib notebook from ipywidgets import import numpy as np import matplotlib pyplot as plt x np lins
  • 无法自动选择 Xcode 项目

    当我在正确的目录中输入 pod install 时 我总是得到这个 分析依赖关系 Could not automatically select an Xcode project Specify one in your Podfile lik
  • SQL 计算所有行而不是计算单个行

    我有一个从数据库请求数据的 SQL 语句 SELECT ID To Poster Content Time ifnull Aura 0 as Aura FROM SELECT FROM SELECT DISTINCT FROM messag
  • WCF 票证基础身份验证

    我正在编写使用 wsHttpBinding 绑定的 WCF 服务 该服务不是托管在 IIS 中而是托管在 Windows 服务中 我希望在服务中有一个 Login user pass 方法 如果用户有效 它将向客户端提供一张票证 谁能帮助我
  • Swift 4 Decodable:嵌套数组的结构

    鉴于以下 JSON 文档 我想创建一个struct有四个属性 filmCount Int year Int category 字符串 以及actor 演员阵列 filmCount 5 year 2018 category Other act