将响应 NSArray 转换为对象数组 swift3

Posted

技术标签:

【中文标题】将响应 NSArray 转换为对象数组 swift3【英文标题】:Converting response NSArray to Object array swift3 【发布时间】:2016-12-12 14:05:20 【问题描述】:

您好,我可以从服务器获取数组列表的响应。但我不知道如何在对象数组 [Feed] 中解析该响应并将其发送到完成处理程序上。我的代码如下:

class FeedsService 

    private var feedsEndPoint: String = "https://jsonplaceholder.typicode.com/posts"

    public func getFeeds(completion: ([Feed]) -> Void) 
        Alamofire.request(feedsEndPoint, method: .get)
            .validate(statusCode: 200..<300)
            .validate(contentType: ["application/json"])
            .responseJSON response in
                print("Response \(response.result.value)")

        
    

饲料模型如下:

class Feed 
    private var title: String
    private var body: String

    init(title:String, body: String) 
        self.title = title
        self.body = body
    

    public func getTitle() -> String 
        return self.title
    

    public func getBody() -> String 
        return self.body;
    

我想将其解析为 Feed Array 并在完成回调时发送。 我正在使用 Alamofire 休息库从休息服务器加载数据。

【问题讨论】:

没有看到您的数据集是什么样子,任何人都无法回答您的问题。 -1 我不知道你投了反对票请检查这里的数据集jsonplaceholder.typicode.com/postsO.o 【参考方案1】:

你可以试试这个:

    class FeedsService 

    private var feedsEndPoint: String = "https://jsonplaceholder.typicode.com/posts"

    public func getFeeds(completion: @escaping ([Feed]) -> Void) 
        Alamofire.request(feedsEndPoint, method: .get)
            .validate(statusCode: 200..<300)
            .validate(contentType: ["application/json"])
            .responseJSON response in
                print("Response \(response.result.value)")
                var feeds = [Feed]()
                if let jsonArray = response.result.value as? [[String: Any]] 
                    for json in jsonArray 
                        if let feed = Feed(json: json) 
                            feeds.append(feed)
                        
                    
                    completion(feeds)
                 else 
                    // handle error
                
        
    

另外,更新您的 Feed 类:

class Feed 
    private var title: String
    private var body: String

    init(title:String, body: String) 
        self.title = title
        self.body = body
    

    init?(json: [String: Any]) 
        guard let title = json["title"] as? String,
            let body = json["body"] as? String else 
                return nil
        
        self.title = title
        self.body = body
    

    public func getTitle() -> String 
        return self.title
    

    public func getBody() -> String 
        return self.body;
    

只需将“标题”和“正文”更改为您的 json 响应中的适当键即可。

正如 El Tomato 指出 Feed init 不起作用,这是一个可以在操场上试用的测试代码:

let testFeedJson = ["title": "Test Title", "body" : "Test Body"]
if let testFeed = Feed(json: testFeedJson) 
    print(testFeed.getTitle())
    print(testFeed.getBody())

【讨论】:

您没有初始化 Feed 以创建 Feed 实例。 对不起,我不明白。 Feed 实例在这里创建:if let feed = Feed(json: json) feeds.append(feed) 检查更新的答案(在底部),请在操场上尝试 Feed 课程。请在给我-1之前告诉我那里有什么问题。 是的,请检查您的答案,感谢您的回复,您能否澄清此代码让 feeds = response.result.value 为! [Feed] print("Feeds count : (feeds.count)") 它确实编译并且计数返回正确 我不确定let feeds = response.result.value as! [Feed] 是否会创建一个Feed 对象数组。服务器正在返回 [String:Any] 对象的数组。您必须遍历该数组并从 [String:Any] 对象创建 Feed 对象。你可以试试我在回答中建议的代码吗?

以上是关于将响应 NSArray 转换为对象数组 swift3的主要内容,如果未能解决你的问题,请参考以下文章

Swift 解析 JSON 时出现问题:无法将“__NSCFDictionary”类型的值转换为“NSArray”错误

将 NSArray 转换为 JSON 对象数组

在 Swift 3 中将 JSON 对象解析为 NSArray

如何将带有对象数组的 json 字符串转换为带有 nsdictionaries 的 nsarray - IOS

Swift中实现Array数组和NSArray数组的相互转换与遍历

如何将下标成员转换为 NSArray Swift 3