快速代码问题-尝试将对象从NSMutableArray投射为自定义对象

问题描述 投票:0回答:2

这是我的代码,无法按如下所述执行。

我正在尝试将对象转换为名为UserData的自定义数据类型。我遇到的第一个问题是不了解如何正确地从数组中获取值其次,我似乎无法将对象转换为所需的类型UserData。我做错了吗?

    func parseJSON(_ data:Data) {

        var jsonResult = NSArray()
        var users = NSMutableArray();

        do{
            jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as! NSArray
        } catch let error as NSError {
            print(error)
        }

        var jsonElement = NSDictionary()
        for i in 0 ..< jsonResult.count {

            print("loop count :", i );

            jsonElement = jsonResult[i] as! NSDictionary

            let user = UserData()

            //the following insures none of the JsonElement values are nil through optional binding
            if let UserID = jsonElement["Userid"] as? String,
                let firstName = jsonElement["First_Name"] as? String,
                let lastName = jsonElement["Last_Name"] as? String,
                let userSessionID = jsonElement["Session_ID"] as? String
            {

                user.UserID = UserID
                user.FirstName = firstName
                user.LastName = lastName
                user.UserSessionID = userSessionID

                print("users firstName:", user.FirstName ?? "blank");

            }

            users.add(user)
        }

        print("users size:", users.count); // this shows 2 
        // So i know I have data loaded... BUT when i try and 
        // get it then it all goes to heck. See below


        // NOT SURE what I am doing here...
        // Thought it was java like where I could just get a
        // item from the NSMutableArray using an index value
        // then cast it as my UserData object
        // and print the output... but this does not work 
        // Why is this so hard?? 

        let userDataVal = users.index(of: 0) as! UserData;
        print("firstName:", userDataVal.FirstName);

    }
swift nsmutablearray
2个回答
1
投票

下面是我编写此函数的方式。一些评论

  • 没有使用NS ...类,而是使用了本机数组和字典
  • 如果JSONSerialization.jsonObject生成错误,则该函数已退出
  • 局部变量的定义应尽可能接近使用它们的位置
  • 为您的UserData结构/类创建一个将值作为参数的初始化方法,因此您可以执行let user = UserData(userId: UserId, firstName:...
  • 用第一个小写字符命名局部变量和属性,这使阅读代码更容易

func parseJSON(_ data:Data) {
    var jsonResult: [[String: Any]]?
    do {
        jsonResult = try JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as? [[String: Any]]
    } catch let error as NSError {
        print(error)
        return
    }

    guard let result = jsonResult else {
        return
    }

    var users = [UserData]()
    for jsonElement in result {
        if let UserID = jsonElement["Userid"] as? String,
            let firstName = jsonElement["First_Name"] as? String,
            let lastName = jsonElement["Last_Name"] as? String,
            let userSessionID = jsonElement["Session_ID"] as? String
        {
            var user = UserData()
            user.UserID = UserID
            user.FirstName = firstName
            user.LastName = lastName
            user.UserSessionID = userSessionID
            users.append(user)
        }
    }

    for user in users {
        print("firstName:", user.FirstName);
    }
}

0
投票

更好的方法是使用JSONDecoder()而不是JSONSerailizer。尝试使用以下代码。

struct User: Codable {
    var userId, firstName, lastName, userSessionId: String

    enum CodingKeys: String, CodingKey {
        case userId = "Userid"
        case firstName = "First_Name"
        case lastName = "Last_Name"
        case userSessionId = "Session_ID"
    }
}

func parseJSON(_ data: Data) {
    do {
        let users = try JSONDecoder().decode([User].self, from: data)
        users.forEach { user in
            print("users first name:", user.firstName)
        }
    } catch {
        print(error.localizedDescription)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.