API моей компании .... уникален.Единственное, что составляет 100%, - это то, что все ответы инкапсулированы в объекте myCompany .И затем либо в объекте Данные , либо в объекте Ошибки .После этого это довольно честная игра.Я работаю с нашим главным разработчиком API, но это медленное изменение, потому что код был написан 10 лет назад и т. Д. И т. Д.
{ "myCompany": {
"Errors": [{
//Various error message key/values based upon who ever created it
}]
}
}
{ "myCompany": {
"Data": {
//any key/value of arrays and objects that I want to turn into a Codable
}
}
}
Можно ли мне проверить, является ли ключ корневого уровнясуществует до того, как я попробую JSON Decode в Codeable Struct?Я надеюсь, что это имеет смысл.
Например, если данные json имеют ключ корневого уровня jsonData["myCompany"]["Data"]
, а MySpecialClass - это то, что запрашивало, я мог бы просто отправить значение jsonData["myCompany"]["Data"]
MySpecialClass , так что он может декодировать JSON
let mydata = try? JSONDecoder().decode(MySpecialClassData.self, from: jsonData["myCompany"]["Data"])
Это было в Objective-C, я мог просто проверить ключи в словаре, чтобы выполнить это.Я еще не знаю этого в Swift.
do {
guard let jsonData = try JSONSerialization.jsonObject(with: urlSessionDataTaskResponse, options: [.allowFragments]) as? [[String:Any]] else {
print("Error jsonData was not in the correct format. Surprise. Surprise.");
if let str = String(data: dataResponse, encoding: String.Encoding.utf8) {
print("Raw Data: \(str)")
}
return
}
// Something like this
// if jsonData["myCompany"]["Data"]
// else if jsonData["myCompany"]["Errors"]
// else who knows throw an error
///I have tried But this doesn't seem to work
guard let myCompany = jsonData["myCompany"] as? [String:Any] else { return }
} catch {
print("ERROR: \(error)")
}
Все учебники, которые я видел, требуют, чтобы я поместил данные в Codable перед тем, как что-либо делать.
Любоймысли?