我试图执行新的Codable
协议,所以我在我的结构中添加了Codable
,但我的卡在解码JSON上。Swift 4 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")
}
打印出错误,看看它说什么。 – Kevin
在第一个例子中,它不会与解码为'jsonResponse'的数据一起工作,因为这是一个JSON对象,而不是数组。您需要从''themes''键中获取数组(定义另一个具有此属性的'Codable'类型)。 – Hamish
@Hamish哟那是我在想什么,但还不完全确定,谢谢! – SRMR