Swift 4 + Alamofire Decodable Json URL格式

3
我是一位有用的助手,可以为您翻译文本。

我有一个JSON格式,使用Alamofire无法解码。

这是我的JSON:

"data":[  
{  
    "id":37,
    "status":"A\u00e7\u0131k",
    "department":"Muhasebe",
    "title":"Y\u00f6netim Panelinden Deneme 4 - Mail Kontrol",
    "message":"<p>Y\u00f6netim Panelinden Deneme 4 - Mail Kontrol<br><\/p>",
    "file":null,
    "created_at":{  
        "date":"2018-01-13 01:59:49.000000",
        "timezone_type":3,
        "timezone":"UTC"
    },
    "replies":[  
        {  
            "id":6,
            "ticket_id":37,
            "admin_id":null,
            "user_id":8593,
            "message":"<p>test<\/p>",
            "file":"uploads\/tickets\/8593-P87wd8\/GFV6H5M94y5Pt27YAxZxHNRcVyFjD554i80og3xk.png",
            "created_at":"2018-01-18 11:16:55",
            "updated_at":"2018-01-18 11:16:55"
        }
    ]
},

这里是我的 JSON 模型:

struct TeknikDestek : Decodable {
    var id: Int?
    var status: String?
    var title: String?
    var department: String?
    var message: String?

    var replies: [Replies]?
}

struct Replies: Decodable {
    var replyid: Int?
    var ticket_id: Int?
    var admin_id: Int?
    var user_id: Int?
    var message: String?
}

我称之为Alamofire,但当我执行response.data时它没有返回。

        Alamofire.request("https://myurl.com.tr/api/tickets/\(userid)").responseJSON { (response) in

        switch response.result {
        case .success:
            if((response.result) != nil) {
                let jsonData = response.data
                print("jsonData: \(test)")
                do{
                self.allReplies = try JSONDecoder().decode([TeknikDestek].self, from: jsonData!)
                    print(self.allReplies)

                    for reply in self.allReplies {
                        print("Reply: \(reply)")
                    }
                }catch {
                    print("Error: \(error)")
                }
                self.view.dismissNavBarActivity()
            }
        case .failure(let error):
            print(error)
        }
    }

这是错误控制台: 错误控制台 我该如何使其工作?我已经花了几个小时,但没有成功。请帮帮我。非常感谢。
1个回答

7

这个问题与Alamofire无关,只与JSONDecoder / Decodable有关。

你需要一个名为“根对象”的umbrella结构体,它是包含data键的字典,而不是数组。这就是错误信息所述的内容。

struct Root : Decodable {
    let data : [TeknikDestek]
}

那么请解码 Root
let root = try JSONDecoder().decode(Root.self, from: jsonData!)

并使用以下代码获取回复:

self.allReplies = root.data.first?.replies // returns `nil` if data is empty

注意:强烈建议将数据结构命名为单数形式(例如Reply),从语义上讲,你有一个单个项目的集合。

非常感谢。这段代码有效。我该如何花费所有的回复,而不仅仅是第一个,例如只有消息? - Ümit Sevim
有一个误解。first 获取外部数组(键为 data)的第一项,这不是与 replies 数组相同的对象。 - vadian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接