尝试编写一个通用函数来将 JSON 解析为可编码结构

2023-12-06

我目前正在像这样解析 JSON

struct ExampleStruct : Codable {
     init() {

     }
     // implementation
}

if let jsonData = jsonString.data(using: .utf8) {
    do {
        let decoder = JSONDecoder()
        let object =  try decoder.decode(ExampleStruct.self, from: jsonData)
    } catch {
        print("Coding error - \(error)")
    }
}

这很好用,但是我周末一直在努力学习泛型。我正在尝试编写一个方法,传入一个 Codable 结构类型和一个 JSON 字符串,该字符串返回我想要返回的类型的对象。

我已经尝试过以下操作:-

func getType<T>(_ anyType: T.Type, from jsonString:String) -> T? {

if let jsonData = jsonString.data(using: .utf8) {
    do {
        let decoder = JSONDecoder()
        let object =  try decoder.decode(anyType, from: jsonData)//Errors here
        return object as? T
        return nil
    } catch {
        print("Coding error - \(error)")
       return nil
    }
  }
return nil
}

然后当我想做上述事情时

 if let exampleStruct:ExampleStruct = getType(type(of: ExampleStruct()), from: jsonString) {
  print(exampleStruct)
 }

但是在 let = object 行上我收到以下错误

无法转换类型“T”的值(全局函数“getType(的通用参数)”:from:)') 到预期的参数类型 'T' (实例方法 'decode( 的通用参数):从:)')

and

在参数类型“T.Type”中,“T”不符合预期类型“Decodable”

正如我所说,这个周末我一直在尝试学习泛型,但我的理解显然遇到了障碍。有没有解决这个问题的方法,这确实是我正在尝试做的事情,甚至是可能的或者是一个好主意?


首先,强烈建议交出一个错误throwing 函数给调用者。
其次Data从 UTF8 字符串创建永远不会失败。

您必须将泛型类型限制为Decodable,不需要将类型作为额外参数传递。

你的函数可以简化为

func getType<T : Decodable>(from jsonString:String) throws -> T {
    let jsonData = Data(jsonString.utf8)
    return try JSONDecoder().decode(T.self, from: jsonData)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试编写一个通用函数来将 JSON 解析为可编码结构 的相关文章

随机推荐

  • 静默使用 Microsoft XPS Document Writer 打印机创建 XPS

    几天来 我一直在努力在没有对话框的情况下将 XPS 打印到文件 我读过 CodeGuru 和 Feng Yuan MSDN 中有关此事的帖子 以及这里的许多讨论主题 但我仍然迷失 具体来说 我的场景是我必须使用一个第三方 API 它会打印到
  • 递归地伊托亚

    我一直在尝试写一个递归的函数版本itoa 代码如下所示 void itoa int n char s static int i 0 if n 10 0 itoa n 10 s else if n lt 0 i 1 s 0 is allrea
  • Gimp 程序中的 OpenCV Python 脚本 - 草地/硬表面边缘检测

    我想开发一个 Python OpenCV 脚本来复制 改进我开发的 Gimp 程序 该过程的目标是提供一个遵循草地和硬表面之间分界线的 x y 点阵列 这个阵列将使我能够完成我的 500 磅 54 英寸宽的压力清洗机器人 它有一个 Rasp
  • 超高性能 C/C++ 哈希映射(表、字典)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我需要将原始键 int 可能是long 映射到高性能哈希映射数据结构中的结构值 我的程序将有几百个这样的地图 每个地图通常最多有几千个条目 然而 地
  • 检票处的脚手架

    是否有适用于 Wicket 1 5 的有效 支持和维护的脚手架解决方案 我知道 Wicketopia 位于两个不同地点来源锻造 and github但这仍然针对 wicket 1 4 带来了自己的 wicket 并且发送到邮件列表的邮件在几
  • 如果更改 2 个部分中的线程数,OpenMP 线程的 SPID 是否应该更改?

    我有 2 个 OpenMP 并行区域 我在 Linux 下的 gcc 下使用 C 具有不同数量的线程 假设一个区域有 4 个线程 另一个区域有 8 个线程 然后 如果我跑ps T pidof name of process 4 个 SPID
  • 为什么数组集合中没有拼接?

    据我所知 拥有集合类背后的整个想法是引入额外的包装方法 这对开发人员来说会很方便 那为什么Flex中的ArrayCollection好像没有一些array有的方法呢 ArrayCollection 没有返回新数组的复制 连接 连接或拼接方法
  • Web 架构:MVC、延迟初始化、数据传输对象、在视图中打开会话,是否有共识方法?

    对于典型的 Web 3 层应用程序 您认为以下设计存在哪些缺陷 以及您理想的架构建议是什么 我目前的蓝图方法非常粗略 假设Java Spring Hibernate JSP 控制器 无状态 可能用只读事务包装 以避免延迟初始化异常 仅通过服
  • 首次调用 WebClient.DownloadString 大约需要 15 秒

    string url http google com index html WebClient client new WebClient Stopwatch sw new Stopwatch sw Start string text cli
  • 如何通过钥匙获取锁

    在不锁定整个集合的情况下防止并发更新键值集中一条记录的最佳方法是什么 从语义上讲 我正在寻找某种按键锁定 理想情况下是 Java 实现 但不一定 interface LockByKey void lock String key acquir
  • 如何安装com.mysql.jdbc.Driver“找不到类名的驱动程序:com.mysql.jdbc.Driver”?

    我正在设置 Atlassian Confluence 在选择数据库时 我选择 使用外部 Mysql DB 我看过一些教程 但对我来说 它并没有按照应有的方式工作 我使用 ubuntu 12 04 服务器并安装了 mysql 现在我尝试与外部
  • awk FieldWITHS 是如何工作的

    几天前我开始学习 awk 编程 有效的 awk 脚本 在第 102 页 作者解释了字段宽度 但我不明白它是如何工作的 请有人向我解释一下 fieldwidths 是如何工作的 场宽以空格分隔的字段宽度列表 设置后 gawk 将输入解析为固定
  • Vuejs 打开/切换单个项目

    我使用单个文件组件 并在其中之一中有一个列表 这个列表应该像手风琴一样工作 但据我在 Vuejs 文档中找到的 让每个项目单独打开并不那么容易 数据 问题和答案 是从 ajax 调用中检索的 我使用 jQuery 来实现这一点 但想知道如何
  • 升级到 Ninject 3.0.0-rc3 后连接字符串异常

    我最近将我的网站项目更新为 Ninject 3 0 0 rc3 之后我收到错误消息 提供的连接无效 因为它包含的映射或元数据信息不足 当我使用 2 2 0 0 版本时 所有这些都有效 知道什么会导致出现此异常以及如何解决它 我使用的是 EF
  • eclipse:覆盖config.ini中的user.name

    我有一个多用户 eclipse 3 4 安装 带有共享主配置区域 用户需要覆盖user name使用他们的全名和通常的方法 添加 Duser name 到 eclipse ini 是不合适的 因为覆盖必须是针对每个用户的 我尝试在 conf
  • 闪亮 - FILL 值未在闪亮服务器中正确传递给 ggplot - 未找到错误对象“输入”

    我正在尝试开发一个闪亮的应用程序 它将在浏览器上安装基于地图的热图 并允许您更改热图上显示的变量 该地图是具有 GIS 形状文件的地理区域 然后所选变量将作为热图显示在地图上 不幸的是我有一个问题 变量没有被传递给ggplot 正确 但我的
  • 从 Java 中的另一个类访问变量的实例

    是否可以从 Java 中的另一个类访问一个类中变量的实例 假设您在 A 类中拥有以下内容 private BlockingQueue
  • 正则表达式检查两个第一个单词是否相同

    例如 s1 Test Test the rest of string s2 Test the rest of string 我想积极匹配 s1但不是 s2 因为第一个词 s1与第二个相同 单词 Test 例如 正则表达式应该适用于任何单词
  • 如何在JS中下载浏览器(包括Firefox)中的10个以上文件

    我尝试使用以下代码一次下载多个文件 var urls for var i 0 i lt urls length i var tempLink document createElement a tempLink setAttribute hr
  • 尝试编写一个通用函数来将 JSON 解析为可编码结构

    我目前正在像这样解析 JSON struct ExampleStruct Codable init implementation if let jsonData jsonString data using utf8 do let decod