使用 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 解码古怪的日期格式

使用 JSONDecoder 解码数字 snake_case 键

如何使用 JSONDecoder 解码自定义 JSON 值

Swift - 使用 JSONDecoder 解码 JSON 数据

如何在 swift 4.1 和 xcode 9.3 中使用 JSONDecoder 解码嵌套的 JSON 数组和对象?

使用 JSONDecoder Swift 解码具有整数值的字符串键 [关闭]