Swift 3 — недопустимый объект JSON из [[String: Any]]

#arrays #dictionary #swift3

#массивы #словарь #swift3

Вопрос:

У меня есть этот экземпляр:

 var commands = [[String: Any]]()
  

После некоторых вычислений его результат:

 [["command": 50022, "homes": [["gateways": [["mac": "845DD74B405E", "services": [["iid": 9, "name": "Some name"]], "aid": 1]], "name": "H1"]]], ["command": 50025, "services": [["mac": "845DD74B405E", "iid": 9, "aid": 1, "new_name": "Some name"]]]]
  

Я хочу преобразовать его ( commands ) в JSON с помощью SwiftyJSON:

 let json = JSON(commands)
print(json) // "unknown"
  

но результат всегда unknown есть .

Затем я проверяю правильность commands , чтобы убедиться, что он конвертируется в JSON. Но я получил false JSONSerialization.isValidJSONObject(commands) , что неожиданно!

Есть ли у вас какие-либо идеи, почему commands (массив словаря) НЕ является допустимым JSON объектом?

Спасибо

Комментарии:

1. Ваш массив действителен.

2. Я согласен с вами, что массив действителен (я проверил его с помощью print(type(of: commands)) -> array). Но что меня смущает: если он действителен, то почему он не является допустимым объектом JSON?

3. Это также допустимый объект JSON. Я доказал это на игровой площадке.

Ответ №1:

Проблема в моих commands целых числах, 50022 и 50025 . В моем коде они определены в enum of UInt32 . И когда я скопировал их на игровую площадку для проверки, Swift преобразует его в Int . Вот почему я всегда добиваюсь успеха на игровой площадке.

Возвращаясь к моему коду, Swift 3 ожидает, что число будет равно an Int , чтобы успешно преобразовать его в объект JSON. Swift 2 не имеет такого поведения.

Итак, после того, как я изменил свое enum определение с UInt32 на Int , оно просто прекрасно работает!

Спасибо всем.