如何解码包含数组Swift 4的JSON文件?

时间:2018-08-06 18:43:13

标签: json swift

我有一个JSON文件,我正在尝试解码,但收到错误消息:

  

typeMismatch(Swift.Dictionary,Swift.DecodingError.Context(codingPath:[_JSONKey(stringValue:“ Index 0”,intValue:0)],debugDescription:“预期用于解码Dictionary,但找到一个数组。”,底层错误:零))

我的代码如下:

struct Phrase: Decodable {
let sentences: [String]
}


func getFromJSON() {

    do {
        let jsonURL = Bundle.main.url(forResource: "script", withExtension: "json")
        let jsonDecoder = JSONDecoder()
        let jsonData = try Data(contentsOf: jsonURL!)
        let jsonSentence = try jsonDecoder.decode([Phrase].self, from: jsonData)
        debugPrint(jsonSentence)

    } catch {
        print(error)
    }
}

我一直在研究许多其他堆栈溢出问题,并且我注意到这些JSON文件的格式与我的不同。它们被格式化为字典,而我的格式是这样-

[
["bin blue", "with A 2 soon"],
["set blue", "in A 9 soon"],
["lay blue", "at A 3 please"],
["3 5 zero zero 5 8"],
["place blue", "by A 6 now"],
["lay green", "at B ZERO now"],
["8 9 1 5 4 zero"]
]

我知道解码器正在寻找字典,但是我如何让它解码数组呢?

2 个答案:

答案 0 :(得分:2)

我认为您需要

let jsonSentence = try jsonDecoder.decode([[String]].self, from: jsonData)

答案 1 :(得分:1)

您的JSON数据与您要解析的结构不匹配。 JSON是字符串数组的数组,而您尝试解析Phrase 对象的数组。

解决方案1 ​​:要保持JSON结构不变,您需要使用类型别名解析数组数组或保持自定义模型类型:

typealias Phrase = [String]

解决方案2 :要保持原样定义的struct,您必须将JSON格式更改为此;

[
  { "sentences": ["bin blue", "with A 2 soon"] },
  { "sentences": ["set blue", "in A 9 soon"] },
  ...
]

这两种解决方案都可以与您的getFromJSON实现一起使用。