Я пишу основной анализатор JSON, столкнувшись с этой странной проблемой, когда загружаемый из файла json отличается от жестко запрограммированного.
Это содержимое файла json, которое я использую
{
"details": {
"date": "2019-02-08T11:08:38Z",
"busId": 4,
"end_date": {
"date": "2019-02-13T18:30:00Z",
"flex": 0,
"timezone": "Asia/Calcutta",
"hasTime": false,
"userDate": "2019-02-14T00:00:00Z"
}
}
}
и код для загрузки json в Swift:
func jsonFromFile(_ name: String) -> [String : Any] {
let path = Bundle.main.path(forResource: name, ofType: "json")!
let data = try! Data(contentsOf: URL(fileURLWithPath: path), options: .alwaysMapped)
let jsonObj = try! JSONSerialization.jsonObject(with: data, options: []) as! [String : Any]
return jsonObj
}
Так я создал буквальный JSON в Swift
let data: [String : Any] = [
"details": [
"date": "2019-02-08T11:08:38Z",
"busId": 4,
"end_date": [
"date": "2019-02-13T18:30:00Z",
"flex": 0,
"timezone": "Asia/Calcutta",
"hasTime": false,
"userDate": "2019-02-14T00:00:00Z"
]
]
]
При анализе я столкнулся со странной проблемой.После копания я обнаружил, что внутреннее представление словаря, созданного из JSON в файле, отличается от JSON, созданного из литерала словаря.Вот выходные данные отладки при загрузке из файла
и при создании из буквального словаря Swift
Хотя они имеют тип [String: Any], они имеют различное внутреннее представление (обратите внимание на фигурные скобки на первом изображении).Одной из проблем, я думаю, могло бы быть JSONSerialization.jsonObject
- возвращать объект типа NSDictionary вместо [String : Any]
;хотя они соединены, но могут иметь различную внутреннюю реализацию.
Итак, как мне убедиться, что я получаю одинаковое представление JSON в [String : Any]
независимо от того, откуда он загружен.
Обновление: я пытался использовать type (of:) в отладчике.Тип первого случая __NSDictionaryI
, а другого - Swift.Dictionary<Swift.String, Any>
, поэтому ясно, что внутренний тип отличается.Мне сразу искать решения, которые позволили бы мне конвертировать NSDictionary в Swift.Dictionary?
Примечание. Причина, по которой стоит задать этот вопрос, заключается в том, что, хотя в большинстве случаев они ведут себя одинаково, я сталкиваюсь с некоторой проблемой при преобразовании переменной в тип протокола.Он отлично работает для Swift.Dictionary, но разрывы кода для NSDictionary (т. Е. Объект, загруженный из файла JSON). Вот протокол
protocol Countable {
var count: Int { get }
}
extension Array: Countable where Element: Any {
}
extension Dictionary: Countable where Key == String, Value == Any {
}
Так что для той же переменной, когда я пишу if var1 is Countable
, он возвращает true дляпервый случай и ложь для второго случая.Хотя это нормально работает, если я пишу отдельную проверку типов для [Любой] и [Строка: Любой]