将 JSON DATA 转换为 Swift 中可用的变量 3
Convert JSON DATA to useable variables in Swift 3
我目前有代码可以获取我提供的 json 数据并对其进行解析,但是我将所有内容都包裹在 for 循环中,但我不知道如何将其取出。
JSON数据:
[
{
"id": 1,
"displayName": "Jacob Blacksten",
"department": "DF",
"mamager": "San",
"office": "NYC",
"util": 2
}
]
工作代码:
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
guard let array = json as? [Any] else {return}
for user in array {
guard let userDict = user as? [String: Any] else {return}
guard let id = userDict["id"] as? Int else { return }
guard let name = userDict["displayName"] as? String else { return}
guard let department = userDict["department"] as? String else {return}
guard let manager = userDict["mamager"] as? String else {return}
guard let office = userDict["office"] as? String else {return}
guard let util = userDict["util"] as? Int else {return}
print(id)
print(name)
print(department)
print(manager)
print(office)
print(util)
}
} catch{
print(error)
}
您会注意到所有内容都在一个 for 循环中,创建一个包含所有 "users" 的数组。但是,我只有一个用户,我希望能够取出 "id" 并将其用作变量,以便稍后在我的应用程序的标签中将其打印出来。我希望这是有道理的。我基本上只想操纵这个 JSON 数据,这样我就可以使用它并将它们打印在我的应用程序的标签中。
如果您试图在别处使用您的变量,您只需将它们保存到循环范围之外的地方。我建议创建一个 User class 并将值从 json 保存到 User.
的实例
// User.swift
class User {
// Identifier
let id: Int
// Instance variables
var name: String?
var department: String?
var manager: String?
var office: String?
var util: Int?
init(withId id: Int) {
self.id = id
}
}
然后,您可以将循环更改为类似这样的内容。
var user: User?
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
guard let array = json as? [Any],
let userDict = array[0] as? [String: Any],
let id = userDict["id"] as? Int,
let name = userDict["displayName"] as? String,
let department = userDict["department"] as? String,
let manager = userDict["manager"] as? String,
let office = userDict["office"] as? String,
let util = userDict["util"] as? Int else {
return
}
user = User(withId: id)
user.name = name
user.department = department
user.manager = manager
user.office = office
user.util = util
} catch{
print(error)
}
// Here, the user variable has all the updated info
userIdLabel?.text = "\(user?.id)"
注意:这都是在浏览器中完成的,没有测试
我目前有代码可以获取我提供的 json 数据并对其进行解析,但是我将所有内容都包裹在 for 循环中,但我不知道如何将其取出。
JSON数据:
[
{
"id": 1,
"displayName": "Jacob Blacksten",
"department": "DF",
"mamager": "San",
"office": "NYC",
"util": 2
}
]
工作代码:
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
guard let array = json as? [Any] else {return}
for user in array {
guard let userDict = user as? [String: Any] else {return}
guard let id = userDict["id"] as? Int else { return }
guard let name = userDict["displayName"] as? String else { return}
guard let department = userDict["department"] as? String else {return}
guard let manager = userDict["mamager"] as? String else {return}
guard let office = userDict["office"] as? String else {return}
guard let util = userDict["util"] as? Int else {return}
print(id)
print(name)
print(department)
print(manager)
print(office)
print(util)
}
} catch{
print(error)
}
您会注意到所有内容都在一个 for 循环中,创建一个包含所有 "users" 的数组。但是,我只有一个用户,我希望能够取出 "id" 并将其用作变量,以便稍后在我的应用程序的标签中将其打印出来。我希望这是有道理的。我基本上只想操纵这个 JSON 数据,这样我就可以使用它并将它们打印在我的应用程序的标签中。
如果您试图在别处使用您的变量,您只需将它们保存到循环范围之外的地方。我建议创建一个 User class 并将值从 json 保存到 User.
的实例// User.swift
class User {
// Identifier
let id: Int
// Instance variables
var name: String?
var department: String?
var manager: String?
var office: String?
var util: Int?
init(withId id: Int) {
self.id = id
}
}
然后,您可以将循环更改为类似这样的内容。
var user: User?
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
guard let array = json as? [Any],
let userDict = array[0] as? [String: Any],
let id = userDict["id"] as? Int,
let name = userDict["displayName"] as? String,
let department = userDict["department"] as? String,
let manager = userDict["manager"] as? String,
let office = userDict["office"] as? String,
let util = userDict["util"] as? Int else {
return
}
user = User(withId: id)
user.name = name
user.department = department
user.manager = manager
user.office = office
user.util = util
} catch{
print(error)
}
// Here, the user variable has all the updated info
userIdLabel?.text = "\(user?.id)"
注意:这都是在浏览器中完成的,没有测试