我想将我的json响应转换为数组,但它没有工作,我得到一个错误,表明我的数组中的项目是nil
func getcomments(){
RestApiManager.sharedInstance.getComments(TUTORIAL_ID: id){
response in
let comments = JSON(response)
for item in comments.array!{
let comment = Comment(memail: String(describing: item["email"]), mcomment: String(describing: item["comment"]), mcomment_date: String(describing: item["comment_date"]), manswer: String(describing: item["answer"]), manswer_date: String(describing: item["answer_date"]))
self.comments.append(comment)
}
}
}
这是我的json回复:
[{
"email": "-",
"comment": "\u0627\u0632 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062e\u0648\u0628\u062a\u0648\u0646 \u0645\u0645\u0646\u0648\u0646\u0645",
"comment_date": "2017-07-15 19:30:00",
"answer": null,
"answer_date": null
},
{
"email": "S.M_Emamian@yahoo.com",
"comment": "salam",
"comment_date": "2017-07-11 19:30:00",
"answer": "\u062a\u0634\u06a9\u0631",
"answer_date": "2017-07-12 03:50:57"
}
]
我在这一行中得到了错误:
在解包可选值时意外发现nil
for item in comments.array!
答案 0 :(得分:1)
如果将其解码为结构数组,则会更容易。
首先,创建结构:
struct Comment: Codable {
var email: String
var comment: String
var comment_date: String
var answer: String
var answer_date: String
}
然后你可以像这样调用JSON:
guard let url = Bundle.main.url(forResource: resource, withExtension: "json") else {
throw Errors.couldNotFindResource
}
data = try! JSONDecoder().decode([Comment].self, from: Data(contentsOf: url))
答案 1 :(得分:1)
根据您的评论,response
实际上是一个字符串。因此,您不能仅使用init(_:)
创建JSON。您需要init(parseJSON:)
。
init(_:)
只会使用该字符串而不是JSON对象创建一个JSON,这显然不是您想要的。 init(parseJSON:)
实际上将解析您的JSON字符串,并允许您访问不同的键值对。
func getcomments(){
RestApiManager.sharedInstance.getComments(TUTORIAL_ID: id){
response in
let comments = JSON(parseJSON: response)