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:嵌套数组的结构 的相关文章

  • Groovy - 将对象转换为 JSON 字符串

    我非常习惯 Grails 转换器 您可以将任何对象转换为 JSON 表示 就像这样 http grails org Converters Reference http grails org Converters Reference retu
  • 如何读取FTL文件中的JSONArray?

    我在我的 Java 文件中硬编码了以下 JSON 对象 JSONObject notificationInfoJson new JSONObject notificationInfoJson put title Payment Receiv
  • 获取键盘高度在 iOS 11 beta 上不起作用

    我有以下在 IOS 10 上运行的代码 但现在在 IOS 11 beta 上运行时不再运行 if let userInfo notification userInfo if let keyboardSize userInfo UIKeybo
  • 如何在一个视图控制器中使用两个自定义 UITableViewCell 创建两个表视图?

    我正在尝试创建两个UITableViews在一个视图控制器中使用两个自定义UITableViewCells 我有以下内容 func tableView tableView UITableView cellForRowAtIndexPath
  • 防止 Realm 在更新对象时覆盖属性

    我已经在 iOS 中设置了一个 REST API 来连接领域对象 然而 我发现在我的对象中创建最喜欢的标志存在问题 我创建了一个最喜欢的布尔值 但是每次从 API 更新该对象时 它都会再次将最喜欢的值设置为默认 false 在这里 我希望这
  • 将 3D 对象添加到 ARGeoAnchor

    如果这个问题不太好 请原谅我 我在 Apple 的 ARGeoAnchor 文档中遇到了一些障碍 目前 ARGeoAnchor 仅在 AR 场景视图中显示一个蓝点 我正在尝试显示任何 3D 渲染或对象 My code let coordin
  • api网关CORS设置

    我正在尝试在部署脚本中使用 aws cli 从命令行设置 aws CORS 我使用以下 perl to shell 命令创建了 POST 资源 我正在尝试将集成响应设置为 就像启用核心一样 aws apigateway put method
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • Swift 1.2 和 Swift 2.0 中的字符串长度[重复]

    这个问题在这里已经有答案了 在以前版本的 Swift 中 我有以下代码 func myfunc mystr String if mystr utf16Count gt 3 使用最新版本的 Swift 1 2 我现在收到以下错误 utf16C
  • Spark运行错误java.lang.NoClassDefFoundError: org/codehaus/jackson/annotate/JsonClass

    import org apache spark SparkContext import org apache spark SparkConf import play api libs json import java util Date i
  • 如何显示启动图像

    我是 iOS 新手 我的 Xcode 版本是 7 2 1 我尝试使用 Swift 在 iOS9 上运行 我的问题是我对如何创建启动屏幕图像感到非常困惑 我发现有很多方法可以为不同版本的 iOS 创建启动屏幕图像 有人可以向我解释一下如何设置
  • 在 wkwebview 中启用摄像头和麦克风访问

    我有一个针对移动设备优化的网络应用程序 它利用getUserMedia访问网络摄像头和麦克风资源 我正在将这个应用程序包装在WKWebView因为我想提供原生应用程序体验 我知道 iOS 不允许通过浏览器访问相机 但是有什么方法可以使用本机
  • 如何在 ECMAScript 6 中导入 JSON 文件?

    如何访问 ECMAScript 6 中的 JSON 文件 以下不起作用 import config from config json 如果我尝试导入 JavaScript 文件 这可以正常工作 https www stefanjudis c
  • 在json文件中导出neo4j数据库

    我想以 JSON 文件导出 Neo4j 图形数据库 This is a Export JSON button in Neo4j web UI version as shown in attached image below 但是 Neo4j
  • Ajax 调用 contentType: 'application/json' 不起作用

    我有一个 ajax 调用 它将表单数据发送到 php 函数 因为我读了很多使用contentType application json 这是最佳实践 我也想尝试一下 但不幸的是 我的脚本在使用时没有返回任何内容 如果我删除它 脚本就会执行它
  • 是否可以在不点击的情况下显示多个标记的多个信息窗口?

    我想在谷歌地图中显示多个标记的多个信息窗口 信息窗口应该在不点击标记本身的情况下显示 是否可以 经过研究 我了解到将标记设置为地图视图选定标记可以使信息窗口显示而无需点击它 但是 不能一次选择多个标记作为地图视图的选定标记 有什么可以做的吗
  • 如何在 Swift 3 中记录函数闭包参数的参数?

    在 Xcode 8 beta 和 Swift 3 中 当您有一个采用闭包作为参数的方法时 例如 func foo bar String gt Void bar Hello world 如何记录闭包所采用的参数 例如 如果我这样写 Calls
  • 使用架构定义验证 JSON 对象

    只要我们可以根据预定义的模式 即 XSD 或 DTD 验证传入的 XML 文件 我们就可以对传入的 JSON 对象执行验证 有可用的 JSON 架构定义吗 有一个工作草案JSON 模式 http json schema org 您还可以看一
  • 如何使用 Swift 将 UIImageView 设置在屏幕中心水平或垂直,但不再使用 StoryBoard

    我正在尝试放置一个UIImageView屏幕上方中央水平方向 正在编码viewDidLoad 而且我有两个预案 这意味着我不知道具体的功能或API 1 我想设置一个等于屏幕宽度一半的变量 我知道它会与 边界 或 框架 相关的东西一起工作 可
  • SwiftUI NavigationView 从其内部开始

    因此 我在页面视图样式的 TabView 中嵌入了一个 NavigationView 首次加载时 NavigationView 将在其内部启动 然后重新加载后即可正常显示 我不确定是什么原因造成的 我制作了一个 GIF 来更好地说明问题 这

随机推荐

  • 函数参数的部分绑定

    有没有办法部分地绑定第一个 最后一个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