将JSON转换为swift对象的最佳方法是什么,检查键和值

时间:2018-02-05 14:55:49

标签: ios json swift

好吧我认为这不是一个重大问题,但我错了。目前我正在开展一个项目,我将获得大量的 JSON 返回。我拿起那些并制作我的模型。现在在我的模型中,我正在检查保护语句是否有 nil 值。以下是我的模型示例:

import Foundation
import SwiftyJSON

class profileModel {

var _phone_no: String?
var _full_name: String?
var _image: String?
var _email: String?
var _profile_pic: String?
var _rating: Int?
var _dob: String?
var _gender: String?
var _firstName: String?
var _lastName: String?


required init?(phone_no: String, full_name: String, image: String, email: String, profile_pic: String, rating: Int, dob: String, gender: String, firstName: String, lastName: String) {
    self._phone_no = phone_no
    self._full_name = full_name
    self._image = image
    self._email = email
    self._profile_pic = profile_pic
    self._rating = rating
    self._dob = dob
    self._gender = gender
    self._firstName = firstName
    self._lastName = lastName
}

convenience init?(json: JSON){

  guard let phone_no = json["phone_no"].string,
        let full_name = json["full_name"].string,
        let image = json["profile_pic"].string,
        let email = json["email"].string,
        let profile_pic = json["profile_pic"].string,
        let rating = json["rating"].int,
        let dob = json["dob"].string,
        let gender = json["gender"].string,
        let firstName = json["first_name"].string,
        let lastName = json["last_name"].string else {
        print("Profile Detail Model Error")
        return nil
    }

    self.init(phone_no: phone_no, full_name: full_name, image: image, email: email, profile_pic: profile_pic, rating: rating, dob: dob, gender: gender, firstName: firstName, lastName: lastName)

  }

}

但是,如果 JSON 中缺少任何,我该怎样才能防止崩溃?好像我同时检查& 这个课真的很大,必须有一些更好的方法。

2 个答案:

答案 0 :(得分:2)

制作属性选项是一种很好的方法,但是你可以利用Swift 4中的新Codable,你可以将JSON解析为任何符合Codable的数据模型。

在您的情况下,您可以编写如下模型:

class ProfileModel: Codable {
    var phone_no: String?
    var full_name: String?
    var profile_pic: String?
    var email: String?
//    var profile_pic: String?
    var rating: String?
    var dob: String?
    var gender: String?
    var first_name: String?
    var last_name: String?
}

当您需要从服务器解码时使用:

let profile = try JSONDecoder().decode(ProfileModel.self, from: json1)

如果你得到一个“Profile”数组,只需将上面一行改为:

let profiles = try JSONDecoder().decode([ProfileModel].self, from: json1)

不再需要使用库SwiftyJSON。

答案 1 :(得分:1)

您应该查看1协议:以下Playground显示当您尝试解析缺少特定密钥的Json时会发生什么。

Codable

首先,我们创建我们的ProfileModel类并模拟一个相关的json。

//: Playground - noun: a place where people can play

import Foundation

解析按预期工作:

class ProfileModel: Codable {

    //...
    var _firstName: String?
    var _lastName: String?

}

let profile = ProfileModel()
profile._firstName = "Hans"
profile._lastName = "Peter"
let json = try! JSONEncoder().encode(profile)

那么当我们向我们的类(_phone_no)添加另一个属性时,会发生什么呢?我们的Json中没有包含这个属性?如果这个新属性是可选的,那么什么都不会改变:

do {
    let profileAgain = try JSONDecoder().decode(ProfileModel.self, from: json)
    print(profileAgain._firstName) // "Optional("Hans")\n"
    print(profileAgain._lastName) // "Optional("Peter")\n"
} catch {
    print("something went wrong")
}

但是如果此属性不是可选的,解码器将抛出错误:

class AnotherProfileModel: Codable {

    //...
    var _firstName: String?
    var _lastName: String?
    var _phone_no: Int?
}

do {
    let anotherProfile = try JSONDecoder().decode(AnotherProfileModel.self, from: json)
    print(anotherProfile._firstName) // "Optional("Hans")\n"
    print(anotherProfile._lastName) // "Optional("Peter")\n"
    print(anotherProfile._phone_no) // "nil\n"
} catch {
    print("something went wrong")
}

我希望这个有效的例子可以帮助您更好地理解class AndYetAnotherProfileModel: Codable { //... var _firstName: String? var _lastName: String? var _phone_no: Int } do { let andYetAnotherProfileModel = try JSONDecoder().decode(AndYetAnotherProfileModel.self, from: json) } catch { print("something went wrong") // "something went wrong\n" } 协议:)