gpt4 book ai didi

json - 使用 AnyObject 初始化 Swift 类?从 NSJSON 序列化

转载 作者:可可西里 更新时间:2023-10-31 23:44:42 28 4
gpt4 key购买 nike

我在 Swift 1.2 中使用 NSJSONSerialization 来解析从 API 响应返回的一些 json。

var err: NSError?
let opts = NSJSONReadingOptions.AllowFragments
let json: AnyObject? = NSJSONSerialization.JSONObjectWithData(jsonData!, options: opts, error: &err)

解析后的 json 作为 AnyObject? 提供。我想使用这个可选的来初始化一个类对象,它可以用作应用程序中的模型数据。

class Alerts {
let type: String
let date: String
let description: String
let expires: String
let message: String

init(json: AnyObject) {
if let
jsonDict = json as? [String: AnyObject],
alertsArray = jsonDict["alerts"] as? [AnyObject],
alertsDict = alertsArray[0] as? [String: AnyObject],
type = alertsDict["type"] as? String,
date = alertsDict["date"] as? String,
description = alertsDict["description"] as? String,
expires = alertsDict["expires"] as? String,
message = alertsDict["message"] as? String
{
self.type = type
self.date = date
self.description = description
self.expires = expires
self.message = message
}
else
{
self.type = "err"
self.date = "err"
self.description = "err"
self.expires = "err"
self.message = "err"
}
}
}

// example of creating a data model from the json
let alerts = Alerts(json: json!)
alerts.type
alerts.date
alerts.description
alerts.expires
alerts.message

因为 NSJSONSerialization 返回一个可选值,我必须在提取 json 数据时检查每个值类型是否存在。正如您在上面的代码中看到的,我使用了 Swift 1.2 中改进的可选绑定(bind)来清理 init 方法。在不使用第三方库的情况下,我还能对类模型(enumsstructstype aliases)做些什么来实现它更具可读性?我应该为模型数据使用 struct 而不是 class 吗?是否可以使用 enumstruct 创建自定义类型来表示 json 对象?

最佳答案

因此,在不使用第三方库的情况下,if let 树通常是最佳实践,您已经展示了这一点。为了在以后的道路上帮助你,也许在 JSON 中重新创建你的对象层次结构作为 Swift 中的结构模型。像这样的东西:

var json = JSON(JSONData.sharedjson.jsonRaw!)
var mongoIdTest = json["resultset"]["account"]["mongoId"].string

struct Root {
var timestamp: Int?
var resultset = ResultSet()

init() {
self.timestamp = json["timestamp"].int
println(json)
}

}

struct ResultSet {
var alert: String?

var account = Account()
var customer = Customer()

init() {

}


}

struct Account {
var mongoId: String?

init() {
mongoId = json["resultset"]["account"]["mongoId"].string
}
}

struct Locations {

}

struct Customer {
var account: String?
var address: String?
var id: String?
var loginId: String?
var mongoId: String?
var name: String?

var opco = Opco()

init() {
account = json["resultset"]["customer"]["account"].string
address = json["resultset"]["customer"]["address"].string
id = json["resultset"]["customer"]["id"].string
loginId = json["resultset"]["customer"]["loginId"].string
mongoId = json["resultset"]["customer"]["mongoId"].string
name = json["resultset"]["customer"]["name"].string
}

}

struct Opco {
var id: String?
var phone: String?
var cutOffTime: String?
var name: String?
var payerId: String?

init() {
id = json["resultset"]["customer"]["opco"]["id"].string
phone = json["resultset"]["customer"]["opco"]["phone"].string
cutOffTime = json["resultset"]["customer"]["opco"]["cutOffTime"].string
name = json["resultset"]["customer"]["opco"]["name"].string
payerId = json["resultset"]["customer"]["opco"]["payerId"].string
}
}

这样您仍然可以使用自动完成和点符号来浏览您的层次结构。

编辑:我有一个来 self 所从事的实际项目的数据结构添加到答案中,希望这能提供一个更好的主意。请记住,我正在使用 SwiftyJSON 进行 JSON() 调用。

编辑 2:

这是我发现的一种方法,可以在不使用其他库的情况下将 JSON 信息放入 Swift 字典中。我不确定是否有另一种方法可以在不使用第三方库的情况下更轻松地做到这一点。

var urlToRequest = "https://EXAMPLE.com/api/account.login?username=MY_USERNAME&password=Hunter2"

if let json = NSData(contentsOfURL: NSURL(string: urlToRequest)!) {

// Parse JSON to Dictionary
var error: NSError?
let boardsDictionary = NSJSONSerialization.JSONObjectWithData(json, options: NSJSONReadingOptions.MutableContainers, error: &error) as? Dictionary<String, AnyObject>
fulljson = boardsDictionary

// Display all keys and values
println("Keys in User Data:")
for (key, value) in boardsDictionary! {
println("\(key)-------\(value)")
}

println(fulljson?["resultset"])
}
else {
println("Test JSON nil: No Connection?")
}

该字典将作为您的结构的输入。

关于json - 使用 AnyObject 初始化 Swift 类?从 NSJSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31529624/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com