Как мне разобрать этот тип JSON с помощью SwiftyJSON?

[

  {

    "ID": 0,

    "Name": "PHI"

  },

  {

    "ID": 0,

    "Name": "ATL"

  }

]

Я использую SwiftyJSON и Alamofire. Это то, что возвращается. Теперь я хочу просмотреть каждый из этих объектов в своем коде. Однако у меня проблемы с получением этой информации.

json[0]["Name"].string, кажется, возвращает ноль, и я не уверен, почему. Объект JSON определенно получает JSON, когда я печатаю его на консоли, он выглядит точно так же, как показано выше.

Я также пробовал:

var name = json[0].dictionary?["Name"]

Все равно ноль.

Любые идеи?

ИЗМЕНИТЬ

Вот код, который я использую для получения JSON.

Alamofire.request(.GET, "url", parameters: nil, encoding: .JSON, headers: nil).responseJSON 
{
    (request, response, data, error) in
    var json = JSON(data!)
    //var name = json[0].dictionary?["Name"]
}

person halterdev    schedule 06.09.2015    source источник
comment
Вы пробовали печатать json[0] ?   -  person Aks    schedule 06.09.2015
comment
Да, json[0] тоже ноль.   -  person halterdev    schedule 06.09.2015
comment
Если json[0] равен нулю, я считаю, что что-то не так с форматированием и/или поиском   -  person Tamarisk    schedule 07.09.2015
comment
Можете ли вы опубликовать весь код, который вы используете, от получения данных до попытки их анализа?   -  person fanfan    schedule 07.09.2015
comment
Я только что добавил код, который использую для поиска, в свой исходный пост.   -  person halterdev    schedule 07.09.2015
comment
Что странно, когда я проверяю это, так это то, что JSON действителен и метод доступа к объекту SwiftyJSON работает (json[0]["Name"].string дает мне необязательную PHI), но ваш пример Alamofire не скомпилировался, мне пришлось изменить подпись.   -  person Eric Aya    schedule 07.09.2015


Ответы (3)


Ваш JSON действителен (по крайней мере, этот фрагмент), и ваш первый метод извлечения данных из SwiftyJSON верен.

С другой стороны, фрагмент Alamofire, который вы показали, не скомпилировался для меня, мне пришлось изменить подпись.

Учитывая, что в комментариях вы говорите, что не только json[0]["Name"] равно нулю, но и json[0] равно тоже нулю, я думаю, у вас есть проблема с тем, как ваши данные извлекаются.

Я протестировал эту версию метода Alamofire в образце приложения, и она работала хорошо:

Alamofire.request(.GET, yourURL).responseJSON(options: nil) { (request, response, data, error) in
    let json = JSON(data!)
    let name = json[0]["Name"].string
    println(name)
}

введите здесь описание изображения

На снимке экрана URL-адрес — это мой локальный сервер, а ваша копия JSON вставлена ​​в «test.json».

Этот "ответ" является продолжением моего комментария, мне нужно место, чтобы показать больше информации...

person Eric Aya    schedule 07.09.2015
comment
Хм... если я отформатирую свой запрос так, как вы сделали с моим URL-адресом, он больше не вернет JSON. данные нулевые. - person halterdev; 07.09.2015
comment
Ok. Я предполагаю, что мы используем разные версии Alamofire. И, возможно, есть что-то еще на вашей стороне. // Я думаю, что теперь вы должны немного больше отладить на своей стороне и проверить каждый шаг, который может выглядеть хорошо, но на самом деле неправильный (классическая ловушка). Что-то вроде 1- проверьте с помощью Alamofire одного, что он возвращает данные. 2- убедитесь, что эти данные являются вашим действительным json. 3- можете ли вы распечатать результат с помощью NSJSONSerializtion? 4- можете ли вы сделать это с помощью SwiftyJSON? И т.п. - person Eric Aya; 07.09.2015
comment
если вы печатаете объект json, как он выглядит для вас? Мой выглядит так: [{ID:0,Name:Philadelphia},{ID:0,Name:NFL}] - person halterdev; 07.09.2015
comment
У меня есть такой же, с той лишь разницей, что он красиво напечатан (с отступом). - person Eric Aya; 07.09.2015
comment
Кстати, просто чтобы подтвердить, что это что-то еще на вашей стороне: я только что вставил [{"ID":0,"Name":"Philadelphia"},{"ID":0,"Name":"NFL"}] из вашего комментария в свой файл test.json, и ваш код все еще работает, я правильно понял имя. - person Eric Aya; 07.09.2015
comment
Подсказка: вы можете проверить правильность данных json, полученных от Alamofire, следующим образом: print(NSJSONSerialization.isValidJSONObject(data!)) - person Eric Aya; 07.09.2015
comment
Это разочаровывает. let jsonObj = JSON(json) println(jsonObj) println(jsonObj[0]["Name"].string) .. Это возвращает JSON, который я показал вам выше, но вторая печать печатает ноль. - person halterdev; 07.09.2015
comment
Интересно .. что isValidJSONObject возвращает для меня false. - person halterdev; 07.09.2015
comment
Прохладный! Круто, потому что мы уверены, что, хотя JSON, который вы получаете, выглядит нормально (с точки зрения человека), на самом деле это не так. Итак, теперь вы сузили проблему. Обычные подозреваемые: невидимые символы, плохая кодировка utf8/ascii/и т. д., умные двойные кавычки вместо обычных и т. д. - person Eric Aya; 07.09.2015
comment
То есть вы думаете, что это, скорее всего, проблема с моим API? - person halterdev; 07.09.2015
comment
Да. Я имею в виду: учитывая, что фрагмент JSON из этого вопроса действителен, и пример кода в вопросе работает с ним, тогда да, скорее всего, это проблема с вашими фактическими полными данными/ответом JSON. Я думаю, что теперь мы оценили, что то, что представлено на этой странице, работает хорошо, поэтому проблема в другом месте. - person Eric Aya; 07.09.2015

Я думаю, вы могли бы попробовать это.

сначала конвертируйте JSON (данные), используя swifyJSON

           let json = JSON(data!)

затем подсчитайте элемент массива в данных.

                let count: Int? = json.array?.count

после этого используйте цикл for для достижения первого элемента массива.

  for index in 0...count-1 {

         self.idArray.append(json[index]["ID"].stringValue)

        self.nameArray.append(json[index]["Name"].stringValue)
               }

вы получите отсортированные данные в «idArray» и «nameArray». попробуйте напечатать оба массива.

person Suraj    schedule 08.09.2015

Вам не нужно использовать индекс для анализа массива. Вы можете получить один объект json из массива и использовать его для доступа к данным:

for (index: String, subJson: JSON) in json {
    println("Current Index = \(index)")

    if let _id = subJson["ID"].int {
        println("ID = \(_id)")
    } else {
        println("Error ID")
    }

    if let _name = subJson["Name"].string {
        println("Name = \(_name)")
    } else {
        println("Error Name")
    }   
}
person Alexey Pichukov    schedule 12.09.2015