使用 JSONDecoder 解码的对象的打印输出出现问题

2024-05-27

我正在尝试快速解码 JSON 字符串,但在解码后访问属性时遇到一些奇怪的问题。

这是我从本地存储的 JSON 文件检索的 JSON 文件的内容

[
  {
    "word": "a",
    "usage": [
      {
        "partOfSpeech": "determiner"
      }
    ]
  }
]

这是访问 JSON 文件属性的代码

struct WordDictionary : Codable {
    var word: String
    var usage: [Usage]
}

struct Usage: Codable {
    var partOfSpeech: String
}
                
if let url = Bundle.main.url(forResource: FILE_NAME, withExtension: "json") {
    do {
        let data = try Data(contentsOf: url)
        let decoder = JSONDecoder()
        
        let jsonData = try decoder.decode([WordDictionary].self, from: data)
        print(jsonData[0].word) //Outputs "a"
        print(jsonData[0].usage) //Outputs "[MyApp.AppDelegate.(unknown context at $102a37f00).(unknown context at $102a38038).Usage(partOfSpeech: "determiner")]"

    } catch {
        print("error:\(error)")
    }
}

正如你所看到的,当我尝试print(jsonData[0].usage)在获得“使用情况”属性之前,我收到了一系列未知的数据消息。当我打印这一行时我只想看看determiner,我不确定序言中关于“未知背景”的内容到底是什么。

我也在运行这段代码didFinishLaunchingWithOptions的功能AppDelegate.

我不确定我错过了什么。几天来我一直在尝试寻找解决方案并尝试不同的方法,但仍然无法获得所需的输出,任何帮助将不胜感激。


tl;dr

您在类型的描述中看到“未知上下文”,因为它是在函数内部定义的。您可以通过将这些类型定义移到函数之外或实现您自己的来解决此问题CustomStringConvertible https://developer.apple.com/documentation/swift/customstringconvertible/一致性。


这是你在哪里定义类型的问题。

考虑:

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        struct WordDictionary: Codable {
            var word: String
            var usage: [Usage]
        }

        struct Usage: Codable {
            var partOfSpeech: String
        }

        do {
            let url = Bundle.main.url(forResource: "test", withExtension: "json")!
            let data = try Data(contentsOf: url)
            let words = try JSONDecoder().decode([WordDictionary].self, from: data)
            print(words[0].usage)
        } catch {
            print(error)
        }

        return true
    }

    ...
}

这会产生:

[MyApp.AppDelegate。($ 102bac454 处未知上下文)。($ 102bac58c 处未知上下文)。Usage(partOfSpeech:“确定符”)]

也就是说Usage是在某些未知的上下文中定义的AppDelegate within MyApp。简而言之,它不知道如何表示函数内定义的类型的层次结构。

对比一下:

class AppDelegate: UIResponder, UIApplicationDelegate {

    struct WordDictionary: Codable {
        var word: String
        var usage: [Usage]
    }

    struct Usage: Codable {
        var partOfSpeech: String
    }

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        do {
            let url = Bundle.main.url(forResource: "test", withExtension: "json")!
            let data = try Data(contentsOf: url)
            let words = try JSONDecoder().decode([WordDictionary].self, from: data)
            print(words[0].usage)
        } catch {
            print(error)
        }

        return true
    }

    ...
}

其产生:

[MyApp.AppDelegate.Usage(partOfSpeech: "限定符")]


您也可以添加自己的CustomStringConvertible https://developer.apple.com/documentation/swift/customstringconvertible/一致性:

struct WordDictionary: Codable {
    var word: String
    var usage: [Usage]
}

struct Usage: Codable {
    var partOfSpeech: String
}

extension Usage: CustomStringConvertible {
    var description: String { "Usage(partOfSpeech: \"\(partOfSpeech)\")" }
}

@main
class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        do {
            let url = Bundle.main.url(forResource: "test", withExtension: "json")!
            let data = try Data(contentsOf: url)
            let words = try JSONDecoder().decode([WordDictionary].self, from: data)
            print(words[0].usage)
        } catch {
            print(error)
        }

        return true
    }

    ...
}

其产生:

[用法(词性:“限定词”)]

Through CustomStringConvertible,你可以使print按照您想要的方式格式化它。

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

使用 JSONDecoder 解码的对象的打印输出出现问题 的相关文章

  • SwiftUI 意外地自动弹出 NavigationLink

    我有一个简单的用例 其中一个屏幕使用 NavigationLink 推送另一个屏幕 iOS 14 5 有一个奇怪的行为 即推送的屏幕在被推送后立即弹出 Code NavigationLink destination EmptyView Em
  • 如何为 iPhone 6+、6 和 5 指定不同尺寸?

    我想让 iPhone 6 6 和 5 上的视图看起来几乎相同 在附图中 我的意思是 例如 取消 按钮在 iPhone 5 中距离屏幕左边缘应为 30 像素 在 6 中为 35 像素 在 6 中为 45 像素 其他元素也类似 如何为每种类型设
  • Swift:设置协议的可选属性

    如何设置协议的可选属性 例如 UITextInputTraits 有许多可选的读 写属性 当我尝试以下操作时 出现编译错误 无法分配给 textInputTraits 中的 keyboardType func initializeTextI
  • iPhone X 将对象底部与安全区域对齐会破坏其他设备上的外观

    关于 iPhone X 自动布局怪癖的问题 我有两个按钮 以前这些按钮将与超级视图底部对齐 偏移量为 20 以免它们接触屏幕底部 此后我将链接更改为安全区域而不是超级视图 Here s the original setup Looks go
  • 在 JsonConverter 中递归调用 JsonSerializer

    我正在写一个JsonConverter要执行一些我需要在读 写时完成的转换任务 特别是 我采用现有的序列化行为 并在写入 读取时添加一些附加属性 在 的里面JsonConverter 我想利用通过的JsonSerializer实例来执行大部
  • 使用数组中的字符串淡入/淡出标签

    func setOverlayTitle self overlayLogo text Welcome var hello String Bon Jour GUTEN nMORGEN BONJOUR HOLA BUENOS D AS BUON
  • SwiftUI:隐藏键盘但显示光标

    我想使用自定义按钮将文本输入到TextField 但仍显示并移动光标 有没有办法隐藏默认键盘 同时仍然显示光标 我希望有这样的事情 TextField text text keyboardType none 这是它目前的样子 您可以使用UI
  • AVAudioPlayer 无法从网站播放 m4a 或 mp3 文件类型

    我试图在我的应用程序中找到一个仅纯 m4a 声音的 URL 我有音频的 URL 理论上可以下载它 然后 使用下载的文件URL到声音 我尝试使用AVAudioPlayer播放它 但它不播放任何声音 这是我的代码 在 URL 检索函数中 我调用
  • 动态调度协议扩展不适用于多个目标

    这是我的主要目标中的代码 所以不是测试目标 protocol ProtocolA func dontCrash extension ProtocolA func dontCrash fatalError func tryCrash dont
  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 无法以编程方式快速设置 NSLayoutConstraint 乘数...“无法分配给此表达式的结果

    我试图以编程方式快速设置乘法器的约束 当我设置该值时 它只会给我错误 无法分配给该表达式的结果 我用 IBOutlet 声明了 NSLayoutConstraint 然后设置乘数 就像我对另一个常量所做的那样 效果很好 但这个不会接受它 I
  • NSPredicate IN 从数组元素查询

    对于一个古怪的标题表示歉意 我有一个 Int 数组 我想定义一个 NSPredicate 来过滤掉 connectionType 等于数组中包含的值的项目 所以基本上是这样的 fetchRequest predicate NSPredica
  • 根据内容自动更改单元格高度 - Swift

    在 Swift 中使用 UITableView 有人可以帮我根据标签 图片和描述自动更改单元格的高度吗 所有信息都正确传递 我只需要帮助格式化它 我尝试使用调整它cell frame size height 但这没有效果 我可以更改故事板中
  • jQuery AJAX 请求在 IE8 中失败,并显示消息“错误:调用 open 方法之前无法调用此方法。”

    我正在使用 jQuery 1 4 2 并尝试执行一个简单的 AJAX 请求 目标 URL 返回一个 JSON 字符串 我使用 jslint 对其进行了验证 该请求在 Firefox 和 Chrome 中有效 但不想在 IE8 中工作 我无法
  • 在 SwiftUI 中使用可观察对象切换视图

    我正在练习尝试使用 SwiftUI 中的可观察对象切换视图 但我的代码无法正常工作 我知道我可以用 State 来做到这一点 但我想用可观察的对象来实现这一点 当我单击内容视图中的图像时 图像不会改变 有人能帮我吗 内容视图 swift i
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • 移动带有图像的文件夹

    我正在使用 Xcode 目前我的图像位于桌面上 将它们移至文件夹的正确方法是什么 当我只是复制粘贴它们时 我的项目不会构建 有没有简单的方法可以做到这一点 而无需将图像一一重新链接 1 在 Xcode 项目导航器中 选择要添加的项目的目标项
  • 使用日期 Swift 3 对字典数组进行排序

    我有一个名为 myArray 的数组 其中添加了字典 我希望该字典按时间排序 这是字典中的键 那个时间是在 String 中 时间的日期格式为 yyyy MM dd HH mm ss 我尝试使用下面的代码解决方案 但给出了 从 字符串转换
  • 上传存档错误:“缺少 iOS 发行版签名身份......”

    我正在尝试使用 Xcode 将我的 iOS 应用程序存档上传到 iTunes Connect 但是当我单击 上传到 App Store 时 出现错误 Xcode 尝试查找或生成匹配的签名资产并 由于以下问题未能做到这一点 缺少 iOS 为
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0

随机推荐

  • SQLAlchemy ORM 从子查询中选择多个实体

    我需要查询多个实体 例如session query Entity1 Entity2 仅来自子查询而不是直接来自表 该文档有一些关于从子查询中选择一个实体 http docs sqlalchemy org en rel 0 8 orm tut
  • Bootstrap 词缀总是“跳跃”

    我想在我的侧边栏上使用 bootstrap 的 affix 插件 然而 由于我的网站是响应式的 它总是在某些维度上跳跃 我无法让它正常工作 我尝试了此处列出的解决方案 如何使用twitter的bootstrap 2 1 0中新的affix插
  • iOS 静态与动态框架说明

    我不得不承认 随着 iOS 8 的发布 我对 iOS 中的动态框架和静态框架有点困惑 我正在寻找一种方法来分发我创建的库 并且我需要支持 iOS 7 及更高版本 注意 这将是一个专有框架 我不能使用 cocoa pods 也不能分发源代码
  • 禁用 ng-packagr 中的 TypeScript 不匹配

    在 Angular CLI 项目中 当使用不受支持的 TypeScript 版本时 您可能会收到以下警告 angular email protected cdn cgi l email protection requires typescr
  • 自定义存储库的 Spring Data Solr 优先级

    我需要在 Spring Data Solr 自定义存储库中实现以下内容 X 或 Y 和 Z 我当前的代码如下 Criteria criteria new Criteria x is X VALUE criteria criteria or
  • 按月/年间隔汇总每日数据

    我并不经常需要在 R 中处理日期 但我认为这相当简单 我有一列代表数据框中的日期 我只想创建一个新的数据框 使用日期按月 年总结第二列 最好的方法是什么 我想要第二个数据框 这样我就可以将它提供给绘图 您能提供的任何帮助将不胜感激 编辑 供
  • VSTS 使用 API 在队列时设置构建参数

    我需要对来自 REST API 的 VSTS 构建进行排队 记录于https learn microsoft com en us rest api vsts build builds queue view vsts rest 4 1 htt
  • 在程序关闭期间捕获Python中的键盘中断

    我正在用 Python 编写一个命令行实用程序 因为它是生产代码 所以应该能够干净地关闭 而不会将一堆内容 错误代码 堆栈跟踪等 转储到屏幕上 这意味着我需要捕获键盘中断 我尝试过使用 try catch 块 例如 if name main
  • sbt:编译测试时设置特定的 scalacOptions 选项

    通常我使用这组选项来编译 Scala 代码 scalacOptions Seq deprecation encoding UTF 8 feature unchecked language higherKinds language impli
  • FindBugs 排除过滤器的问题

    我正在评估 FindBugs 并尝试使用 exceptFilter 以便该工具不会处理测试包或生成的 ejb 存根 我已经尝试过以下方法
  • 如何使用 scipy.integrate 获取截断球体的体积?

    我正在努力使用 scipy integrate 我使用了 tplquad 但是我该如何使用integrate获得 截断 球体的体积 谢谢 import scipy from scipy integrate import quad dblqu
  • 将自己编写的 TypeScript 模块导入 Svelte 组件时出现错误

    我正在尝试将自己编写的 TypeScript 模块导入到 Svelte 组件中 但是 当我尝试使用以下行导入模块时 我收到以下错误 import TelegramBotForSafetyMania from telegram bot 我们收
  • 带有 CosmosDBTrigger 的 Azure 函数似乎不是由 upsert 触发的

    我是第一次使用 Azure Functions 我正在尝试编写一个简单的函数来响应更改或添加到 CosmosDb 集合中的文档 我写的函数如下所示 FunctionName ChangeLog public static void Run
  • MPI_Type_Create_Hindexed_Block 生成派生数据类型的错误范围

    使用Fortran 我尝试为动态分配的结构构建派生数据类型 但它得到了新类型的错误范围 代码如下 PROGRAM MAIN IMPLICIT NONE INCLUDE mpif h INTEGER I INTEGER MYID NUMPRO
  • 我可以让 lein cloverage 跳过特定测试吗?

    我正在进行一个 Leiningen 项目 其集成测试注释如下 deftest manual test v3 preview preview client http localhost 10313 v3 preview 当我这样做时 这些测试
  • Web.GetFileByServerRelativeUrl 抛出“值未落在预期范围内”

    我有一个存储文档的 SP Online 站点 添加 检索文档没有任何问题 但在删除流程中 我在检索文档时遇到错误File object public static void DeleteDocument using ClientContex
  • Oracle中表的列重新排序

    我有一个包含 50 多列的表 我需要交换前两列的顺序 使用 Oracle 实现此目的的最佳方法是什么 假设表名是 ORDERDETAILS 前两列是 ITEM ID 和 ORDER ID 重命名完成后 表名仍应为 ORDERDETAILS
  • ASP.NET 4.0 中的模拟 HttpRequest

    我见过很多类似的帖子 但没有一个能真正解决我的特殊情况 我正在 ASP NET 4 0 Web 应用程序 ASP NET Forms 而不是 MVC 中编写单元测试 代码中有几个地方我称之为ServerVariables调用变量的集合 例如
  • 如何使用joda时间将固定的毫秒数格式化为hh:mm:ss?

    我输入了 34600 毫秒 我想以 00 00 34 HH MM SS 的格式输出 为此我应该查看 JDK Joda time 的哪些类 我需要它是高效的 最好是线程安全的 以避免每次解析时创建对象 谢谢 编辑 使用此代码提供时区敏感的结果
  • 使用 JSONDecoder 解码的对象的打印输出出现问题

    我正在尝试快速解码 JSON 字符串 但在解码后访问属性时遇到一些奇怪的问题 这是我从本地存储的 JSON 文件检索的 JSON 文件的内容 word a usage partOfSpeech determiner 这是访问 JSON 文件