2016-04-21 3 views
-1

Я пытаюсь разобрать json. Выполняется кастинг в [String, AnyObject?]. в то время как [String, AnyObject] преуспеваетNSJSONSerialization терпит неудачу при внесении в словарь <String, AnyObject?>. Преуспеть при вводе в словарь <String, AnyObject>

if let jsonDictionary = try! NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableContainers) as? Dictionary<String,AnyObject?> { 
     print(jsonDictionary["output"]) 
    } 
    else { 
     print("Parsing Error") 
    } 

выше разборе терпит неудачу, в то время как ниже преуспевает

if let jsonDictionary = try! NSJSONSerialization.JSONObjectWithData(responseData, options: NSJSONReadingOptions.MutableContainers) as? Dictionary<String,AnyObject> { 
     print(jsonDictionary["output"]) 
    } 
    else { 
     print("Parsing Error") 
    } 

Я хочу знать, почему это происходит.

+0

Как выглядит json? И как это терпит неудачу? Что происходит? – nhgrif

+0

(В качестве примечания, так как вы уже 'if let'-ing, вы, вероятно, должны« попробовать? »Вместо' try! '... и вы никогда не должны« пытаться! »). – nhgrif

+0

{ "result": "success", "transl_text": "\ u0bb9 \ u0bb2 \ u0bc7 \ u0bbe" } это json – sparrowceg

ответ

2

По определению все ключи и значения в словаре Swift должны быть необязательными.

Swift словарь мостик Foundation NSDictionary и там документация говорит

Ни ключ, ни значение может быть нулевым

Кстати: В Swift установка значения для данного ключа до nil удаляет ключ

+0

из вашего объяснения один ключ удаляется, а что касается других ключей ?. это приведет к сбою всего разбора json? – sparrowceg

+0

Это означает, например, если у вас есть словарь '[" alpha ": 1," beta ": 2]' и вы пишете 'dict [" beta "] = nil', это то же самое, что и' [dict removeObjectForKey: @ "beta "]' в ObjC. Другие клавиши не влияют. – vadian

+0

Итак, синтаксический анализ удастся в любом случае .. любая подсказка, почему json parser терпит неудачу здесь. Я использую Swift 2.1 – sparrowceg

Смежные вопросы