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