使用 JSONDecoder 解码 [[String]]?
Posted
技术标签:
【中文标题】使用 JSONDecoder 解码 [[String]]?【英文标题】:Decoding [[String]] using JSONDecoder? 【发布时间】:2018-12-09 17:26:47 【问题描述】:在过去的 12 个月里,我一直远离 Swift,但刚刚回到一个以前可以运行的应用程序 (Swift 4.0),但现在似乎失败了,我不知道为什么。
我的问题与 JSONDecoder 和尝试解码字符串数组的数组有关。
var tryingToDecode: [[String]]
我使用的 JSON 格式如下(见下表),实际数据请使用以下链接。
JASON DATA
我正在使用的代码是(见下文)self.requestData 是我正在使用的 JSON 数据,它在解码我的所有其他数据时有效,它只是不适用于 [ [字符串]]
func TEST_decodeReceivedJSON()
let decoder = JSONDecoder()
do
let array = try decoder.decode(DataStruct.self, from: self.requestData)
print(array)
catch
print("Error")
我用于解码的结构是
struct DataStruct: Codable
var data: [[String]]
这只是测试代码,但是当我编译它时,我总是会遇到 catch 错误。我试过在网上搜索,但找不到任何相关的例子。奇怪的是,在 Xcode 10 之前这个功能有效,它甚至被 App Store 接受了。许多用户现在告诉我,有些东西不起作用,确实如此,这似乎与使用 DataStruct 解码 [[String]] 的特定部分有关。
任何帮助或指点将不胜感激。
[EDIT 001] 添加了指向 JSON 数据的链接,下面的代码显示了一个最小示例,我特别感兴趣的是我应该如何访问 [[String]] - 数组的字符串数组。我正在尝试断言,因为这之前一直在工作,我尝试解码 JSON 的方式是否有问题(可能是 Swift 更新/更改),或者 JSONDecoder 是否有问题。
[EDIT 002] 解决方案是 [[String?]] 并且问题确实在 JSON 中,如果你在原始数据的文本暴风雪中看不到它查看下面的表格视图,您可以清楚地看到 Item 10 为“null”,因此代码需要一个可选的字符串。
【问题讨论】:
请显示真实的 JSON 数据,而不是一些表格视图 - 更好的是:minimal 示例演示问题。 解码器准确地告诉你问题出在哪里,但你把这些信息扔掉了。为什么?将print("Error")
替换为print(error)
,您将立即知道问题所在。
我已经用 JSON 数据 "data" : [["foo", "bar"], ["baz"]]
测试了你的代码,它工作正常。链接后面的 JSON 看起来完全不同,并且与 struct DataStruct
不匹配。 – 我们需要minimal reproducible example。
感谢大家的出色 cmets,感谢 matt 的“错误”指针,非常感谢。
【参考方案1】:
问题不在于JSONDecoder
,问题在于您的 JSON 数据。
当我检查您的代码时,我收到以下错误:
valueNotFound(Swift.String, Swift.DecodingError.Context(codingPath: [编码键(字符串值:“数据”,intValue:无),_JSONKey(字符串值: "索引 11", intValue: 11), _JSONKey(stringValue: "索引 10", intValue: 10)], debugDescription: "预期字符串但发现空值 而是。”,基础错误:无))
在您的代码中,您期望的是字符串,但是当我检查您的 JSON 数据时,它包含 null
值,它显然会破坏书面代码。要解决此问题,您只需将模型定义更改为接受 null/nil
值:
struct DataStruct: Codable
var data: [[String?]]
【讨论】:
Midhun,那个失踪的“?”正是问题所在,我不得不稍后在我的代码中进行一些解包,但它现在可以按预期工作。我不确定这种变化是否来自 Swift 处理选项的方式(我知道这已经发展了多年),或者“null”字段是否是 JSON 数据中的新内容,因此没有让我失望之前起来。无论如何,非常感谢你,你完全解决了这个问题,非常感谢先生。 @fuzzygoat 欢迎您。我认为 JSON 数据中的null
项是新的,JSONDecoder 类在引入后并没有发生太大的变化。无论如何,很高兴听到您的问题已解决。快乐编码!!!以上是关于使用 JSONDecoder 解码 [[String]]?的主要内容,如果未能解决你的问题,请参考以下文章
使用 JSONDecoder 解码数字 snake_case 键
Swift - 使用 JSONDecoder 解码 JSON 数据