2015-03-09 2 views
2

Я пытаюсь создать приложение для iPhone, которое должно потреблять веб-сервис, написанный в nodejs + MongoDB. Приложение выполнено в Swift, но теперь у меня проблема, я не смог правильно разобрать данные.Разбор json для геолокации Приложение iOS

В настоящее время у меня есть следующий код:

var endpoint = NSURL(string: self.url + "?latitud=" + self.latitude + "&longitud=" + self.longitude) 
    var data = NSData(contentsOfURL: endpoint!) 

    var error: NSError? = nil 

    if let json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary { 
     for place in json { 
      var name = place["obj"]["name"] 
      var coords = place["obj"]["coords"] 

      var annotation = MKPointAnnotation() 
      annotation.title = name as? String 
      annotation.coordinate = coords as? CLLocationCoordinate2D 
      map.addAnnotation(annotation) 
     } 

    } 

К сожалению, это не работает :(

Ответ от веб-сервиса похож на это:

[ 
    { 
     "dis": 1.22, 
     "obj": { 
      "name": "Some name", 
      "coords": [ 
       -97.1228, 
       17.4049 
      ], 
      "phones": [ 
       "555 555 55555", 
       "444 444 44444" 
      ], 
      "address": { 
       "street": "Some Street", 
       "zip": "00000" 
      } 
     } 
    }, 
    { 
     "dis": 2.03, 
     "obj": { 
      "name": "Othe name", 
      "coords": [ 
       -97.0910 
       17.7099 
      ], 
      "phones": [ 
       "777 777 7777" 
      ], 
      "address": { 
       "street": "Other street", 
       "zip": "11111" 
      } 
     } 
    } 
] 

Вот что я «Делает неправильно? Есть ли более элегантный (и особенно эффективный) способ сделать запросы API RESTful?

ответ

2

Ваш отдых API возвращает массив NSDictionary, если заменить

if let json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary {
с
if let boardsDictionary = NSJSONSerialization.JSONObjectWithData(inputData, options: NSJSONReadingOptions.MutableContainers, error: &error) as? Array<NSDictionary> {
Вы должны получить данные в виде массива. Это позволит вам получить доступ к данным

+1

It. лучше использовать Array вместо NSArray? –

+0

Здесь http://stackoverflow.com/a/24038680/2976077 - отличный ответ в отношении родных типов. Общепринятой практикой является использование родных типов Swift I.e. Массив в этом случае. – milo526

1

Данные ответа от веб-службы - это JSONArray, вы должны преобразовать его в NSArray, но не NSDictionary.

if let json: NSDictionary = NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers, error: &error) as? NSDictionary { 

Я не знаком с swfit, но, похоже, вы должны изменить эту строку.

Если у вас есть какие-либо проблемы с RESTful API вызова от клиента, вы можете попробовать это http://unirest.io/

Unirest довольно хороший легким HTTP-клиент для создания RESTful API вызова и кожуры ответа с JSON.

+0

Вы совершенно правы, изменение NSArray NSDictionary для меня было лучше, что из Unirest велик, спасибо за эту рекомендацию –

0

Я не знаю, о Swift, но я думаю, что вы забыли кавычки в коде ...

вар Coords = место [ «OBJ»] [ "Coords]

Может быть:

вар Coords = место [ "OBJ"] [ "Coords"]

+0

Да, вы правы, ошибка при написании примера ... –

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