7

我正在尝试实现新Codable协议,所以我添加Codable到我的结构中,但一直在解码 JSON

这是我以前的:

结构 -

struct Question {
    var title: String
    var answer: Int
    var question: Int
}

客户 -

...

guard let data = data else {
    return
}

do {
    self.jsonResponse = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any]
    let questionItems = self.jsonResponse?["themes"] as! [[String: Any]]

    questionItems.forEach {
        let item = Question(title: $0["title"] as! String,
                            answer: $0["answer"] as! Int,
                            question: $0["question"] as! Int)
        questionData.append(item)
    }

} catch {
    print("error")
}

这是我现在所拥有的,除了我无法弄清楚解码器部分:

结构 -

struct Question: Codable {
    var title: String
    var answer: Int
    var question: Int
}

客户 -

...

let decoder = JSONDecoder()
if let questions = try? decoder.decode([Question].self, from: data) {
    // Can't get past this part
} else {
    print("Not working")
}

它打印“不工作”,因为我无法通过该decoder.decode部分。有任何想法吗?将根据需要发布任何额外的代码,谢谢!

编辑:

API JSON 示例:

{
  "themes": [
    {
      "answer": 1,
      "question": 44438222,
      "title": "How many letters are in the alphabet?"
    },
    {
      "answer": 0,
      "question": 44438489,
      "title": "This is a random question"
    }
  ]
 }

如果我打印self.jsonResponse我得到这个:

Optional(["themes": <__NSArrayI 0x6180002478f0>(
{
    "answer" = 7;
    "question" = 7674790;
    title = "This is the title of the question";
},
{
    "answer_" = 2;
    "question" = 23915741;
    title = "This is the title of the question";
}

我的新代码:

struct Theme: Codable {
    var themes : [Question]
}

struct Question: Codable {
    var title: String
    var answer: Int
    var question: Int
}

...

if let decoded = try? JSONDecoder().decode(Theme.self, from: data) {
    print("decoded:", decoded)
} else {
    print("Not working")
}
4

3 回答 3

8

如果你的 JSON 有结构

{"themes" : [{"title": "Foo", "answer": 1, "question": 2},
             {"title": "Bar", "answer": 3, "question": 4}]}

您需要该themes对象的等价物。添加这个结构

struct Theme : Codable {
    var themes : [Question]
}

现在您可以解码 JSON:

if let decoded = try? JSONDecoder().decode(Theme.self, from: data) {
    print("decoded:", decoded)
} else {
    print("Not working")
}

包含的Question对象被隐式解码。

于 2017-06-08T04:25:08.057 回答
1

您收到此错误是因为您的 JSON 的结构可能如下:

{
  "themes": [
    { "title": ..., "question": ..., "answer": ... },
    { "title": ..., "question": ..., "answer": ... },
    { ... }
  ],
  ...
}

但是,您编写的代码需要 a[Question]在顶层。你需要的是一个不同的顶级类型,它的themes属性是[Question]. 当您解码该顶级类型时,您的密钥[Question]将被解码。themes

于 2017-06-08T02:55:28.483 回答
0

你好@all 我已经为 Swift 4 添加了 JSON 编码和解码的代码。

请使用此处的链接

于 2018-05-19T21:01:13.170 回答