Как получить сигнал от JSON - PullRequest
0 голосов
/ 30 апреля 2018

Я получаю данные из 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()

1 Ответ

0 голосов
/ 01 мая 2018

Ох, бедняжка, гигантский муравей сильно ударил тебя проклятием зла 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 хэше, кажется, разделены = вместо :, это не будет проанализировано стандартным совместимым парсером
  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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...