Преобразование массива словарей в словарь и инициализация модели - PullRequest
0 голосов
/ 18 января 2019

Я получаю массив словарей с сервера. Затем я пытаюсь преобразовать его в jsonDictionary, кажется, что я делаю что-то не так. Как я могу также инициировать мою модель пользователей? Вот код:

func getSearchedUsers(key: String, completion: @escaping(SearchedUsers?) -> Void) {
    if let url = URL(string: baseURL + "search?qerty=\(key)") {
        Alamofire.request(url).responseJSON { (response) in
            if let array = response.result.value as? [[String:Any]] {
                var dictionary = [String:Any]()
                for item in array {
                    for (key, value) in item {
                        dictionary.updateValue(value, forKey: key)
                    }
                }
            } else {
                completion(nil)
            }
        }
    }
}

А вот и модель:

class SearchedUsers {
    let id: Int
    let username: String?
    let fullName: String?
    let profilePicture: URL?
    let isPrivate: Bool

    init(data: [String: Any]) {
        id = data["id"] as! Int
        username = data["username"] as? String
        fullName = data["fullName"] as? String
        isPrivate = data["isPrivate"] as! Bool
        profilePicture = data["profilePicUrl"] as? URL
    }
}

Как мне заставить это работать?

Вот ответ, который я получаю:

[Result]: SUCCESS: (
    {
    byline = "21.9k followers";
    followerCount = 21911;
    friendshipStatus =         {
        following = 0;
        "incoming_request" = 0;
        "is_bestie" = 0;
        "is_private" = 0;
        "outgoing_request" = 0;
    };
    fullName = "Undefined Variable";
    hasAnonymousProfilePicture = 0;
    id = 8513861541;
    isPrivate = 0;
    isVerified = 0;
    mutualFollowersCount = 0;
    picture = "https://scontent-ams3-1.cdninstagram.com/vp/885ac17fe17809de22790f0559f61877/5CD13A1C/t51.2885-19/s150x150/39312159_480582069091253_3011569611268161536_n.jpg?_nc_ht=scontent-ams3-1.cdninstagram.com";
    pk = 8513861541;
    profilePicId = "1857507164564653723_8513861541";
    profilePicUrl = "https://scontent-ams3-1.cdninstagram.com/vp/885ac17fe17809de22790f0559f61877/5CD13A1C/t51.2885-19/s150x150/39312159_480582069091253_3011569611268161536_n.jpg?_nc_ht=scontent-ams3-1.cdninstagram.com";
    reelAutoArchive = on;
    username = "i_am_variable";
},
    {
    byline = "467 followers";
    followerCount = 467;
    friendshipStatus =         {
        following = 0;
        "incoming_request" = 0;
        "is_bestie" = 0;
        "is_private" = 0;
        "outgoing_request" = 0;
    };
    fullName = undefined;
    hasAnonymousProfilePicture = 0;
    id = 8657882817;
    isPrivate = 0;
    isVerified = 0;
    latestReelMedia = 1547794887;
    mutualFollowersCount = 0;
    picture = "https://scontent-ams3-1.cdninstagram.com/vp/fb3c992c899aa269bdce2c4c1db8575b/5CD068BA/t51.2885-19/s150x150/46378106_2062632390480778_1266491662662631424_n.jpg?_nc_ht=scontent-ams3-1.cdninstagram.com";
    pk = 8657882817;
    profilePicId = "1931972067016763185_8657882817";
    profilePicUrl = "https://scontent-ams3-1.cdninstagram.com/vp/fb3c992c899aa269bdce2c4c1db8575b/5CD068BA/t51.2885-19/s150x150/46378106_2062632390480778_1266491662662631424_n.jpg?_nc_ht=scontent-ams3-1.cdninstagram.com";
    reelAutoArchive = on;
    username = "undefi.ned";
})

Это массив словарей, мне нужно разобрать его должным образом. Это моя главная проблема.

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы можете использовать Decodable, если у вас есть Struct вместо Class для простого анализа.Вот пример в Alamofire 5.0

struct SearchedUsers: Decodable {
    let id: Int
    let username: String?
    let fullName: String?
    let profilePicture: URL?
    let isPrivate: Bool
}

AF.request("http://url_endpoint/").responseData { response in
            do {
                // data we are getting from network request
                let decoder = JSONDecoder()
                let response = try decoder.decode([SearchedUsers].self, from: response.data!)

            } catch { print(error) }
        }
0 голосов
/ 18 января 2019

Если вы знаете, как разбирать словарь, то вы должны знать, как его создать;) Существуют инструменты для создания собственного класса модели, например: http://www.jsoncafe.com/

РЕДАКТИРОВАТЬ : Как предложено Робертом в разделе комментариев ниже, вы можете выучить Decodable.

Вы можете использовать это, чтобы дать себе представление о том, как может или должен выглядеть класс модели. Используйте его так, как вам нравится. В приличном проекте может быть множество данных, и вы не хотите делать из него модель класса, особенно если вы единственный, кто обрабатывает проект iOS.

Итак, мы предполагаем, что у нас есть данные json, основанные на вашем посте:

{
    "id": 1,
    "username": "dd",
    "fullName": "dd",
    "profilePicture": "ddd",
    "isPrivate": true
}

Мы могли бы сделать из нее модель примерно так:

//
//  UserRootClass.swift
//  Model Generated using http://www.jsoncafe.com/
//  Created on January 18, 2019

import Foundation

class UserRootClass : NSObject {

    var fullName : String!
    var id : Int!
    var isPrivate : Bool!
    var profilePicture : String!
    var username : String!


    /**
     * Instantiate the instance using the passed dictionary values to set the properties values
     */
    init(fromDictionary dictionary: [String:Any]){
        fullName = dictionary["fullName"] as? String
        id = dictionary["id"] as? Int
        isPrivate = dictionary["isPrivate"] as? Bool
        profilePicture = dictionary["profilePicture"] as? String
        username = dictionary["username"] as? String
    }

    /**
     * Returns all the available property values in the form of [String:Any] object where the key is the approperiate json key and the value is the value of the corresponding property
     */
    func toDictionary() -> [String:Any]
    {
        var dictionary = [String:Any]()
        if fullName != nil{
            dictionary["fullName"] = fullName
        }
        if id != nil{
            dictionary["id"] = id
        }
        if isPrivate != nil{
            dictionary["isPrivate"] = isPrivate
        }
        if profilePicture != nil{
            dictionary["profilePicture"] = profilePicture
        }
        if username != nil{
            dictionary["username"] = username
        }
        return dictionary
    }

}

Класс модели выше был создан с использованием инструмента, который я дал выше, но я удалил методы протокола NSCoding.

Надеюсь, это поможет! Удачи и добро пожаловать в Stackoverflow.

...