如何使用Codable解析此JSON?

时间:2018-07-21 03:22:38

标签: ios json iphone swift codable

我一直试图从我的JSON解析此对象,并不断收到此错误:

  

“错误:typeMismatch(Swift.Array,   Swift.DecodingError.Context(codingPath:[],debugDescription:   “打算对数组进行解码,但是找到了一个字典。”,   底层错误:nil))\ n“

如果我从此处let video = try decoder.decode([Content].self, from: data)卸下阵列支架,则会收到一条错误消息:

  

“错误:keyNotFound(CodingKeys(stringValue:” description“,intValue:nil),Swift.DecodingError.Context(codingPath:[],debugDescription:”没有与Key CodingKeys(stringValue:\“ description \”, intValue:nil)(\“描述\”)。“,底层错误:nil))\ n”

我该如何解决?这是我的JSON和代码:

    JSON: 

        > {     "content": [{
        >              "description": "Hello",
        >              "category": "World wides",
        >              "creator": {
        >              "name": "The One",
        >              "site": "Purple",
        >              "url": "http://www.sample.com"
        >              },
        >              "time": 300,
        >              "full": "https:sample2.com",
        >              "clothes": "jacket",
        >              }] 
           }


struct Content: Decodable {
    let description: String
    let category: String
}


if let fileURL = Bundle.main.url(forResource: "stub", withExtension: "json") {
    do {
        let data = try Data(contentsOf: fileURL)

        let decoder = JSONDecoder()
        let video = try decoder.decode([Content].self, from: data)

        print(video.description)

        // Success!
       // print(content.category)
    } catch {
        print("Error: \(error)")
    }
} else {
    print("No such file URL.")
}

2 个答案:

答案 0 :(得分:3)

在您的JSON数据中,content包含一个由单个元素组成的数组。

我建议您这样创建结构:

struct Response: Decodable {
  let content: [Item]
}

struct Item: Decodable {
  let description: String
  let category: String
}

然后您可以对其进行解码并像这样使用它:

let response = try decoder.decode(Response.self, from: data)
guard !response.content.isEmpty else { // error handling here }
let video = response.content[0]

答案 1 :(得分:0)

缺少根对象的对应结构,该结构是带有键{}的字典(content)。

这说明了两条错误消息(该对象是一个字典,没有键description)。

content的值是一个数组,因此您需要循环以遍历项目。

struct Root : Decodable {
    let content : [Content]
}

struct Content: Decodable {
    let description: String
    let category: String
}

...

let root = try decoder.decode(Root.self, from: data)
let content = root.content
for item in content {
    print(item.description)
}