在swift3中将json数据转换为数组

时间:2017-08-14 09:10:23

标签: json swift xcode

我想将我的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!

2 个答案:

答案 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)