2015-10-15 4 views
-1

Я пытаюсь разобрать JSON из RestAPI с этим кодом:Анализировать JSON с REST API

if var dict : NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary { 
    println("Dictionary: \(dict)") 
} else { 
    println("nil") 
    var resultString = NSString(data: data, encoding: NSUTF8StringEncoding) 
    println(resultString) 
} 

Но словарь не создается (я думаю, что это недопустимый формат JSON), и я только получить строка такая как:

Optional(set_metadata('allergy',[{"id":"396","shortDescription":"Dairy-Free","longDescription":"Dairy-Free","searchValue":"396^Dairy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"397","shortDescription":"Egg-Free","longDescription":"Egg-Free","searchValue":"397^Egg-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"393","shortDescription":"Gluten-Free","longDescription":"Gluten-Free","searchValue":"393^Gluten-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"394","shortDescription":"Peanut-Free","longDescription":"Peanut-Free","searchValue":"394^Peanut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"398","shortDescription":"Seafood-Free","longDescription":"Seafood-Free","searchValue":"398^Seafood-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"399","shortDescription":"Sesame-Free","longDescription":"Sesame-Free","searchValue":"399^Sesame-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"400","shortDescription":"Soy-Free","longDescription":"Soy-Free","searchValue":"400^Soy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"401","shortDescription":"Sulfite-Free","longDescription":"Sulfite-Free","searchValue":"401^Sulfite-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"395","shortDescription":"Tree Nut-Free","longDescription":"Tree Nut-Free","searchValue":"395^Tree Nut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"392","shortDescription":"Wheat-Free","longDescription":"Wheat-Free","searchValue":"392^Wheat-Free","type":"allergy","localesAvailableIn":["en-US"]}]);)

Как я могу преобразовать это в NSDictionary? Или какую-то структуру, с которой я могу справиться?

+0

Там может быть недопустимые символы в начале JSON. Попробуйте отрезать их, а не сериализацию JSON. – dirtydanee

ответ

0

У вас есть недопустимые символы в начале и в конце ответа.

Я хотел бы предложить следующее, чтобы преодолеть эту проблему:

Преобразовать ответ в NSString. Чем отрезать «set_metadata (" аллергия»с самого начала и последних 3-х символов

Затем вы должны закончить со следующей строкой:.

[{"id":"396","shortDescription":"Dairy-Free","longDescription":"Dairy-Free","searchValue":"396^Dairy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"397","shortDescription":"Egg-Free","longDescription":"Egg-Free","searchValue":"397^Egg-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"393","shortDescription":"Gluten-Free","longDescription":"Gluten-Free","searchValue":"393^Gluten-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"394","shortDescription":"Peanut-Free","longDescription":"Peanut-Free","searchValue":"394^Peanut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"398","shortDescription":"Seafood-Free","longDescription":"Seafood-Free","searchValue":"398^Seafood-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"399","shortDescription":"Sesame-Free","longDescription":"Sesame-Free","searchValue":"399^Sesame-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"400","shortDescription":"Soy-Free","longDescription":"Soy-Free","searchValue":"400^Soy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"401","shortDescription":"Sulfite-Free","longDescription":"Sulfite-Free","searchValue":"401^Sulfite-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"395","shortDescription":"Tree Nut-Free","longDescription":"Tree Nut-Free","searchValue":"395^Tree Nut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"392","shortDescription":"Wheat-Free","longDescription":"Wheat-Free","searchValue":"392^Wheat-Free","type":"allergy","localesAvailableIn":["en-US"]}] 

теперь позволяет преобразовать строку обратно в NSData :

let serializeableData = dataString!.dataUsingEncoding(NSUTF8StringEncoding) 

и JSON:

var jsonErrorOptional : NSError? 
let json: AnyObject! 
      do { 
       json = try NSJSONSerialization.JSONObjectWithData(serializeableData!, options: NSJSONReadingOptions(rawValue: 2)) 
      } catch let error as NSError { 
       jsonErrorOptional = error 
       json = nil 
      } catch { 
       fatalError() 
      } 

Убедитесь, что JSON является действительным

if let _json = json as? [[String : AnyObject]] { 
    // _json should be a valid swift dictionary 
} 

Я знаю, кажется, нечеткое решение немного, но он работал на меня, прежде чем

+0

Хорошо, я сделал это, но как я могу конвертировать обратно в JSON? И не лучше ли прячутся непосредственно в NSDictionary? –

+0

см. Мои правки. Зачем конвертировать его в NSDictionary, когда вы делаете это быстро? – dirtydanee

+0

Я хочу сохранить NSDictionary в список объектов с этим JSON, поэтому я не использовал ваше решение, но это отлично работает для меня: let data1 = resultString! .dataUsingEncoding (NSUTF8StringEncoding) var json: AnyObject? = NSJSONSerialization.JSONObjectWithData (data1 !, options: .MutableContainers, error: nil) –

1

Строка Размещенное Вами журнал выписка из консоли. Это заявление:

Optional(set_metadata('allergy',[{"id":"396","shortDescription":"Dairy-Free","longDescription":"Dairy-Free","searchValue":"396^Dairy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"397","shortDescription":"Egg-Free","longDescription":"Egg-Free","searchValue":"397^Egg-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"393","shortDescription":"Gluten-Free","longDescription":"Gluten-Free","searchValue":"393^Gluten-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"394","shortDescription":"Peanut-Free","longDescription":"Peanut-Free","searchValue":"394^Peanut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"398","shortDescription":"Seafood-Free","longDescription":"Seafood-Free","searchValue":"398^Seafood-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"399","shortDescription":"Sesame-Free","longDescription":"Sesame-Free","searchValue":"399^Sesame-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"400","shortDescription":"Soy-Free","longDescription":"Soy-Free","searchValue":"400^Soy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"401","shortDescription":"Sulfite-Free","longDescription":"Sulfite-Free","searchValue":"401^Sulfite-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"395","shortDescription":"Tree Nut-Free","longDescription":"Tree Nut-Free","searchValue":"395^Tree Nut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"392","shortDescription":"Wheat-Free","longDescription":"Wheat-Free","searchValue":"392^Wheat-Free","type":"allergy","localesAvailableIn":["en-US"]}]);) 

Ваша строка не является обязательным, поэтому фактическая строка это:

set_metadata('allergy',[{"id":"396","shortDescription":"Dairy-Free","longDescription":"Dairy-Free","searchValue":"396^Dairy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"397","shortDescription":"Egg-Free","longDescription":"Egg-Free","searchValue":"397^Egg-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"393","shortDescription":"Gluten-Free","longDescription":"Gluten-Free","searchValue":"393^Gluten-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"394","shortDescription":"Peanut-Free","longDescription":"Peanut-Free","searchValue":"394^Peanut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"398","shortDescription":"Seafood-Free","longDescription":"Seafood-Free","searchValue":"398^Seafood-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"399","shortDescription":"Sesame-Free","longDescription":"Sesame-Free","searchValue":"399^Sesame-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"400","shortDescription":"Soy-Free","longDescription":"Soy-Free","searchValue":"400^Soy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"401","shortDescription":"Sulfite-Free","longDescription":"Sulfite-Free","searchValue":"401^Sulfite-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"395","shortDescription":"Tree Nut-Free","longDescription":"Tree Nut-Free","searchValue":"395^Tree Nut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"392","shortDescription":"Wheat-Free","longDescription":"Wheat-Free","searchValue":"392^Wheat-Free","type":"allergy","localesAvailableIn":["en-US"]}]); 

Это не действует в формате JSON. JSON фактически начинается с первого [. Ниже приводится JSON вам нужно разобрать:

[{"id":"396","shortDescription":"Dairy-Free","longDescription":"Dairy-Free","searchValue":"396^Dairy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"397","shortDescription":"Egg-Free","longDescription":"Egg-Free","searchValue":"397^Egg-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"393","shortDescription":"Gluten-Free","longDescription":"Gluten-Free","searchValue":"393^Gluten-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"394","shortDescription":"Peanut-Free","longDescription":"Peanut-Free","searchValue":"394^Peanut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"398","shortDescription":"Seafood-Free","longDescription":"Seafood-Free","searchValue":"398^Seafood-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"399","shortDescription":"Sesame-Free","longDescription":"Sesame-Free","searchValue":"399^Sesame-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"400","shortDescription":"Soy-Free","longDescription":"Soy-Free","searchValue":"400^Soy-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"401","shortDescription":"Sulfite-Free","longDescription":"Sulfite-Free","searchValue":"401^Sulfite-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"395","shortDescription":"Tree Nut-Free","longDescription":"Tree Nut-Free","searchValue":"395^Tree Nut-Free","type":"allergy","localesAvailableIn":["en-US"]},{"id":"392","shortDescription":"Wheat-Free","longDescription":"Wheat-Free","searchValue":"392^Wheat-Free","type":"allergy","localesAvailableIn":["en-US"]}] 

же строка довольно напечатал:

[ 
    { 
    "id": "396", 
    "shortDescription": "Dairy-Free", 
    "longDescription": "Dairy-Free", 
    "searchValue": "396^Dairy-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "397", 
    "shortDescription": "Egg-Free", 
    "longDescription": "Egg-Free", 
    "searchValue": "397^Egg-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "393", 
    "shortDescription": "Gluten-Free", 
    "longDescription": "Gluten-Free", 
    "searchValue": "393^Gluten-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "394", 
    "shortDescription": "Peanut-Free", 
    "longDescription": "Peanut-Free", 
    "searchValue": "394^Peanut-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "398", 
    "shortDescription": "Seafood-Free", 
    "longDescription": "Seafood-Free", 
    "searchValue": "398^Seafood-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "399", 
    "shortDescription": "Sesame-Free", 
    "longDescription": "Sesame-Free", 
    "searchValue": "399^Sesame-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "400", 
    "shortDescription": "Soy-Free", 
    "longDescription": "Soy-Free", 
    "searchValue": "400^Soy-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "401", 
    "shortDescription": "Sulfite-Free", 
    "longDescription": "Sulfite-Free", 
    "searchValue": "401^Sulfite-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "395", 
    "shortDescription": "Tree Nut-Free", 
    "longDescription": "Tree Nut-Free", 
    "searchValue": "395^Tree Nut-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    }, 
    { 
    "id": "392", 
    "shortDescription": "Wheat-Free", 
    "longDescription": "Wheat-Free", 
    "searchValue": "392^Wheat-Free", 
    "type": "allergy", 
    "localesAvailableIn": [ 
     "en-US" 
    ] 
    } 
] 
Смежные вопросы