我从JSON获取数据。我想知道如何获取信号值。因为根据信号,所有代码都可以工作。
["status": 200, "data": {"in_time" = "12:00 PM"; "out_time" = ""; signal = 01;}, "Message": Enable out time]
这是我正在使用的代码:这是我用来获取json响应的所有数据
let parameters = ["emp_id": self.att_emp_id]
var request = URLRequest(url : url!)
request.httpMethod = "POST"
request.httpBody = try? JSONSerialization.data(withJSONObject:parameters, options: [])
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
let session = URLSession.shared
session.dataTask(with: request, completionHandler: { (data, response, error) in
if let data = data {
do {
let json = try? JSONSerialization.jsonObject(with: data, options: []) as! Dictionary<String, Any>
if let json = json {
print("HERE SHOULD BE YOUR JSON viewdidAppear\(json)")
//var datas = [String:AnyObject]()
let status = json["status"] as? String
if let datas = json["data"] as? [String:AnyObject] , let in_time_Str = datas["in_time"] as? String, let out_time_Str = datas["out_time"] as? String , let grace_Str = datas["grace"] as? String , let signal_Str = datas["signal"] as? String
{
self.server_in_time = in_time_Str
self.server_out_time = out_time_Str
self.grace_str_time = grace_Str
self.sig_str = signal_Str
}
print("Signal : \(String(describing: self.sig_str))")
if status == "200" {
if self.server_in_time != "" {
print("Here is attendance IN TIME : \(self.server_in_time)")
}
if self.server_out_time != "" {
print("Here is attendance OUT TIME : \(self.server_out_time)")
}
if self.sig_str == "10" {
DispatchQueue.main.async {
self.out_time_button.isEnabled = false
}
} else if self.sig_str == "01" {
DispatchQueue.main.async {
self.inTimeTextField.text = self.server_in_time
self.in_time_button.isEnabled = false
self.out_time_button.isEnabled = true
}
} else if self.sig_str == "00" {
DispatchQueue.main.async {
self.inTimeTextField.text = self.server_in_time
self.outTimeTextField.text = self.server_out_time
self.in_time_button.isEnabled = false
self.out_time_button.isEnabled = false
}
}
} else {
print("Error : \(String(describing: error))")
}
}
}
} else {
print("Error \(String(describing: error?.localizedDescription))")
}
}).resume()
哎呀,可怜的你,巨大的蚂蚁用邪恶的JSONSerialization
的诅咒严重击中了你(原谅廉价的NetHack扯掉了)。这一开始看起来很容易,但你必须处理邪恶的Optional
/ Any
的诅咒(演员)。如果你使用Codable
协议,你会好得多(甚至有关错误信息)。这将归结为以下内容:
import Cocoa
let jsonData = """
{"status": 200,
"data": {
"in_time": "12:00 PM",
"out_time": "",
"signal": "01",
},
"Message": "Enable out time"
}
""".data(using: .utf8)!
struct TimeData: Codable {
let inTime: String
let outTime: String
let signal: String
enum CodingKeys : String,CodingKey {
case inTime = "in_time"
case outTime = "out_time"
case signal
}
}
struct TimeResult: Codable {
let status: Int
let data: TimeData
let message: String
enum CodingKeys : String,CodingKey {
case status, data
case message = "Message"
}
}
do {
let timeData = try JSONDecoder().decode(TimeResult.self, from:jsonData)
print(timeData)
} catch {
print(error)
}
正如您可能已经注意到我必须使用您的“JSON”修改相当多的东西来进行编译。
hash
,而不是array
,即你的JSON字符串应该以{
而不是[
开头,并以}
作为回报。data
hash中的值似乎用=
而不是:
分隔,这不会被标准的兼容解析器解析key:value
哈希中的data
对用;
而不是,
分隔,这不会被标准的兼容解析器解析key
线的signal
部分没有被"
包围,表示String
值不会......(你知道现在的演习)value
线的signal
部分没有被"
包围,这使得解析器猜测它是一个导致非法条件的数字(“Number with leading zero around character 103.
”)。如果你使用JSONDecoder
和适当的Codable
协议为你的模型,所有这些错误(除了可能是第一个)都很容易发现。然而,考虑到不幸的JSONSerialization
,它们很难被发现,它会尝试(太)难以理解你投掷的任何东西......
并记录:
print(timeData.data.signal)
即使没有过度使用signal
绑定,也会以非常简单的方式精美地访问您的if let=...
。
在重读了上述内容后,我意识到,您的“JSON”可能源于您首先打印data
的方式。尝试使用
print(String(data:data, encoding:.utf8)!)
找出你的JSON
实际上是什么样子。