2016-09-27 3 views
0

Я работаю над подключением к базе данных между Swift 3 и php-файлом. Отправка информации в php будет корректно перенесена в базу данных.swift 3 json not working

Но у меня возникла проблема, когда я хочу распечатать информацию из базы данных в свой xcode.

Я посылаю это JSON в мое приложение:

[{"latitude":"51.430536341034","longitude":"5.45947450542819"}, 
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}, 
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}, 
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}, 
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}] 

Я напечатал этот JSON в Xcode с:

print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!) 

Я попытался 2 варианта, которые были описаны в других темах на этом сайте, которые оба касались быстрых проблем 3 и json.

Вариант 1:

let parsedData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject] 

Когда я запускал приложение, приходят допущена ошибка:

Signal SGBRT Could not cast value of type '__NSArrayI' (0x1b2a89cc8) to 'NSDictionary' (0x1b2a8a128).

Вариант 2:

let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! Dictionary<String, AnyObject> 

Что происходит такое же сигнал SGBRT с ошибка:

Could not cast value of type '__NSArrayI' (0x1b2a89cc8) to 'NSDictionary' (0x1b2a8a128).

Мне нужно сказать, что я не профессионал, но я - ученик с твердым обучением без каких-либо подключений, которые также бывают быстрыми. Поэтому я надеюсь получить помощь здесь, чтобы закончить эту функцию приложения.

Если вы ответите на эту тему, я был бы рад получить здесь некоторые другие коды, которые я должен попробовать. Спасибо.

+1

Ну, массив не словарь ... !! Вы должны представить результат как массив словарей: '[[String: AnyObject]]' вместо словаря. – Moritz

+0

И вам не нужно 'allowFragments'. Кроме того, 'Dictionary ' совпадает с '[String: AnyObject]'. – Moritz

+0

@ EricAya Хорошо, что решает эту конкретную ошибку, но сразу же появляется новая. Когда я хочу получить его широту, например: parsedData ["широта"], он скажет Type '[[String: AnyObject]]? не имеет подстрочных индексов. – royvano

ответ

0

Ваш JSON ясно говорит, что это массив словарей, поэтому вы должны отдать его в массив словарей [[String: AnyObject]]. Уже упоминается в комментариях. Попробуйте ниже, это может помочь вам:

//First you should check for data whether it has value 
if let data = data { 
    //This gives you an array of dictionaries as per your JSON data. So safer side try to 'guard let' it so that it should not crash if your JSON data is nil 
    guard let parsedDataArray = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: AnyObject]] else { return } 

    //Here you can enumerate through your array to get each dictionary 
    for parsedDict in parsedDataArray { 
     //This gives the value of latitude 
     if let latitude = parsedDict["latitude"] { 
      print(latitude) 
     } 
     //And this is for "longitude" 
     if let longitude = parsedDict["longitude"] { 
      print(longitude) 
     } 
    } 
} 
1

Из вашего ответа JSON, что вы добавили в вопросе, если это был единственный ответ, который вы должны использовать [[String: String]] вместо [[String: AnyObject]], потому что с помощью AnyObject вам нужно сначала преобразовать его до String, тогда двойное, так что это тесто, если вы используете [[String: String]]. Теперь у вас есть массив словаря, поэтому получите все координаты таким образом.

let parsedData = try? JSONSerialization.jsonObject(with: data!, options: []) as! [[String:String]] 
for dic in parsedData { 
    if let lat = Double(dic["latitude"]), let long = Double(dic["longitude"]) { 
     print(lat) 
     print(long) 
    } 
} 
+0

YESS! Ваше решение работает, я так благодарен! Кто-нибудь может его оценить, я не могу этого сделать ... Но на самом деле спасибо Нираву Д! – royvano

+0

Приветственный помощник :) –