如何从JSON获取信号

问题描述 投票:-2回答:1

我从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()
ios json swift
1个回答
1
投票

哎呀,可怜的你,巨大的蚂蚁用邪恶的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”修改相当多的东西来进行编译。

  1. 你的顶级结构是hash,而不是array,即你的JSON字符串应该以{而不是[开头,并以}作为回报。
  2. data hash中的值似乎用=而不是:分隔,这不会被标准的兼容解析器解析
  3. 你的key:value哈希中的data对用;而不是,分隔,这不会被标准的兼容解析器解析
  4. 你的key线的signal部分没有被"包围,表示String值不会......(你知道现在的演习)
  5. 你的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实际上是什么样子。

© www.soinside.com 2019 - 2024. All rights reserved.