Стрижи интерпретации JSON - PullRequest
       7

Стрижи интерпретации JSON

0 голосов
/ 13 февраля 2019

Я пишу основной анализатор 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, созданного из литерала словаря.Вот выходные данные отладки при загрузке из файла This is how the dictionary looks when loaded from file

и при создании из буквального словаря Swift

From literal dictionary


Хотя они имеют тип [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 дляпервый случай и ложь для второго случая.Хотя это нормально работает, если я пишу отдельную проверку типов для [Любой] и [Строка: Любой]

1 Ответ

0 голосов
/ 13 февраля 2019

Не волнуйтесь, они имеют одинаковую внутреннюю структуру, и вы можете использовать их наоборот.Единственное отличие - это класс или структура, которые они используют для хранения (отладчик показывает вывод метода описания. Таким образом, фигурные скобки являются продуктом этого метода описания, а не более).Вы можете попытаться сравнить их в коде с помощью метода isEqual (to :), и вы увидите, что они равны.Сравнивает внутреннюю структуру и содержание коллекций.

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