Как использовать swiftyjson для анализа данных json для создания объекта и циклического анализа данных

Итак, я пытаюсь получить его необработанные данные json и использовать их для просмотра в таблице (так что одна ячейка таблицы будет --> Emirates - $ 1588,77)

Проблема: возникли проблемы с анализом данных JSON. alamofire, по-видимому, делает это автоматически? но я полностью запутался с типами данных. Я продолжаю получать странные ошибки, такие как «нет члена с именем подстрочного индекса» (у меня также установлен swiftyjson, но решение, отличное от swiftyjson, также должно работать.

Код:

    request(qpxRequest).responseJSON { (request, response, json, error) -> Void in
        if response != nil {
           //println(response!)
        }
        if json != nil {


          // 1. parse the JSON data into a Foundation object
         // 2. Grab the data from the foundation object (so its can be looped though      in a table)

}


{
trips =     {
    data =         {
        carrier =             (
                            {
                name = "Cathay Pacific Airways Ltd.";
            },
                            {
                name = Emirates;
            },
                            {
                name = "Ethiopian Airlines Enterprise";
            },
                            {
                name = "Qantas Airways Ltd.";
            },
                            {
                name = "South African Airways";
            }
        );
    };
    tripOption =         (
                    {
            saleTotal = "AUD1537.22";
        },
                    {
            saleTotal = "AUD1588.77";
        },
                    {
            saleTotal = "AUD1857.42";
        },
                    {
            saleTotal = "AUD1857.42";
        },
                    {
            saleTotal = "AUD1922.42";
        }
    );
};

}


-------- Редактировать.


Используя эту модель.

class FlightDataModel {
    var carrier: String
    var price: String

    init(carrier: String?, price: String?) {
        self.carrier = carrier! 
        self.price = price!
    }
}

Как бы я использовал ваше решение, чтобы добавить его в массив класса FlightDataModel?

Это моя моя попытка..

var arrayOfFlights : [FlightDataModel] = [FlightDataModel]()



 if let tripOptions = trips["tripOption"] as? [[String:AnyObject]] {
                        for (index, tripOption) in enumerate(tripOptions) {
                            //println("\(index): " + (tripOption["saleTotal"]! as String))

                            self.arrayOfFlights[index].carrier = tripOption["saleTotal"]! as String


                            println("\(self.arrayOfFlights[index].carrier)")
                        }

person topazt    schedule 08.05.2015    source источник
comment
Можете ли вы указать строку, которая выдает ошибку   -  person Kaunteya    schedule 08.05.2015


Ответы (1)


Alamofire может это сделать, но вы должны копаться в своей структуре JSON. :)

Вот так, используя метод Alamofire responseJSON:

    Alamofire.request(.GET, YOUR_URL, parameters: nil, encoding: .URL).responseJSON(options: NSJSONReadingOptions.allZeros) { (request, response, json, error) -> Void in
        if let myJSON = json as? [String:AnyObject] {
            if let trips = myJSON["trips"] as? [String:AnyObject] {
                if let data = trips["data"] as? [String:AnyObject] {
                    if let carriers = data["carrier"] as? [[String:String]] {
                        for (index, carrierName) in enumerate(carriers) {
                            println("\(index): " + carrierName["name"]!)
                        }
                    }
                }
                if let tripOptions = trips["tripOption"] as? [[String:AnyObject]] {
                    for (index, tripOption) in enumerate(tripOptions) {
                        println("\(index): " + (tripOption["saleTotal"]! as! String))
                    }
                }
            }
        }
    }

Выход:

0: Cathay Pacific Airways Ltd.
1: Emirates
...
0: AUD1537.22
1: AUD1588.77
...

Со SwiftyJSON действительно немного проще. И для разнообразия на этот раз мы будем использовать метод Alamofire responseString:

    Alamofire.request(.GET, YOUR_URL, parameters: nil, encoding: .URL).responseString(encoding: NSUTF8StringEncoding, completionHandler: {(request: NSURLRequest, response: NSHTTPURLResponse?, responseBody: String?, error: NSError?) -> Void in

        if let dataFromString = responseBody!.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) {
            let json = JSON(data: dataFromString)
            let carriers = json["trips"]["data"]["carrier"].array
            for (index, carrier) in enumerate(carriers!) {
                println("\(index):" + carrier["name"].string!)
            }
            let tripOption = json["trips"]["tripOption"].array
            for (index, option) in enumerate(tripOption!) {
                println("\(index):" + option["saleTotal"].string!)
            }
        }

    })

Выход:

0: Cathay Pacific Airways Ltd.
1: Emirates
...
0: AUD1537.22
1: AUD1588.77
...

Примечание. Я использовал enumerate в качестве примера получения индекса контента одновременно с получением контента.

person Eric Aya    schedule 08.05.2015
comment
Это сработало! аллилуйя. Не могли бы вы взглянуть на мою правку выше? Я пытаюсь собрать данные в массив класса FlightDataModel. Пожалуйста, дайте мне знать, что вы думаете. Спасибо, Эрик. - person topazt; 09.05.2015
comment
Я спрашиваю, потому что данные не отображаются в консоли. - person topazt; 09.05.2015
comment
Похоже, есть проблема с тем, как вы пытаетесь создать свой объект в строке self.arrayOfFlights[index].carrier = ..., но я боюсь, что это совсем другая тема, чем этот вопрос. Мое предложение: либо вы создаете другой вопрос по этому поводу, либо мы можем провести быстрое обсуждение в чате. :) - person Eric Aya; 09.05.2015
comment
У меня недостаточно репутации, чтобы использовать чат. Перейдите по этому адресу: tlk.io/swift - person topazt; 09.05.2015
comment
У меня нет 20 репутации. Это не позволит мне говорить. Иди сюда: tlk.io/swift - person topazt; 09.05.2015
comment
let myFlight = FlightDataModel (перевозчик: имя_перевозчика [имя] как строка) Имеет отсутствующий аргумент ошибки для параметра «цена» в вызове - person topazt; 09.05.2015
comment
Да, посмотрите, как создается ваша модель: var price: String не является необязательным, поэтому его обязательно инициализировать при создании объекта (даже если вы указали необязательные параметры в вызове метода init, это не меняет фактический тип объекта). переменная, и вы все равно принудительно разворачиваете инициализацию...). Либо вы создаете объект, инициализируя два параметра (цена + перевозчик), либо вы делаете price необязательным, добавляя ? следующим образом: var price: String?, и вы не принудительно разворачиваете в инициализации. - person Eric Aya; 09.05.2015
comment
На этом этапе я серьезно предлагаю вам оставить этот пост в покое и подготовить другой вопрос (этот пост посвящен синтаксическому анализу, и он решен, теперь вы хотите создать собственный объект с вашими данными, а это другая проблема/тема), где вы даете контекст того, что вы делаете, как вы это делаете и где ошибка. Здесь, в комментариях, вы не получите столько помощи сейчас... :) - person Eric Aya; 09.05.2015