Хобрук: Ваш путь к мастерству в программировании

В указанном URL-адресе мне нужно получить только первый словарь из URL-адреса?

В этом массиве сведений о заказе у меня есть 10 словарей, но мне нужно отобразить только первый словарь. Может ли кто-нибудь помочь мне, как это реализовать?

http://www.json-generator.com/api/json/get/bUKEESvnvS?indent=2

вот мой код, показанный ниже

func downloadJsonWithURL() {
        let url = NSURL(string: self.url)
        URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in
            if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
               self.orderdetailsArray = (jsonObj!.value(forKey: "Orders detail") as? [[String: AnyObject]])!
                for array in self.orderdetailsArray {
                    let key = "OrderId"
                    let value = "#1000501"
                    for (key,value) in array{
                    if let addressDict = array as? NSDictionary{
                        if let orderid = addressDict.value(forKey: "OrderId"){
                            self.orderid.append(orderid as! String)
                        }
                        if let orderdate = addressDict.value(forKey: "OrderDate"){
                            self.orderdate.append(orderdate as! String)
                        }
                        if let subtotal = addressDict.value(forKey: "SubTotal"){
                            self.subTotal.append(subtotal as! Int)
                        }
                        if let Shipping = addressDict.value(forKey: "Shipping"){
                            self.shippingPrice.append(Shipping as! Int)
                        }
                        if let tax = addressDict.value(forKey: "Tax"){
                            self.tax.append(tax as! Int)
                        }
                        if let grandtotal = addressDict.value(forKey: "GrandTotal"){
                            self.grandTotal.append(grandtotal as! Int)
                        }
                        if let shippingAddress = addressDict.value(forKey: "ShippingAddress"){
                            self.shippingAddress.append(shippingAddress as AnyObject)
                        }
                        if let shippingMethod = addressDict.value(forKey: "ShippingMethod"){
                            self.shippingMethod.append(shippingMethod as AnyObject)
                        }
                        if let billingAddress = addressDict.value(forKey: "BillingAddress"){
                            self.billingAddress.append(billingAddress as AnyObject)
                        }
                        if let paymentMethod = addressDict.value(forKey: "PayMentMethod"){
                            self.paymentMethod.append(paymentMethod as AnyObject)
                        }
                        self.itemsArray = addressDict.value(forKey: "Items detail") as! [[String : AnyObject]]
                    }
                }
                }
                OperationQueue.main.addOperation({
                    self.tableDetails.reloadData()
                })
            }
        }).resume()
    }
20.07.2017

  • в основном вам просто нужно получить первую запись из ответа, верно? 20.07.2017
  • да первый словарь @Joshua 20.07.2017
  • @VamsiKrishna Отметьте мой ответ как полезный, если он решил вашу проблему 20.07.2017
  • да братан @SamarthKejriwal 20.07.2017
  • как отобразить сведения об элементе: [ItemQty: 3] вы сделали это 20.07.2017
  • @BikeshThakur опубликует вопрос, и я помогу вам с этим 20.07.2017
  • @SamarthKejriwal stackoverflow.com/questions/45136583/ помогите мне 21.07.2017

Ответы:


1

Сделай это. :

let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary

guard let Ordersdetail = jsonObj["Orders detail"] as? [NSDictionary] else {
        print("Cannot find key 'Orderdetails' in \(jsonObj)")
        return
    }

Чтобы получить доступ к содержимому первого словаря, сделайте следующее:

 var orderid = Ordersdetail[0]["OrderId"]!
 var shippingadress = Ordersdetail[0]["ShippingAddress"]!
 var total = Ordersdetail[0]["GrandTotal"]!
 var subtotal = Ordersdetail[0]["SubTotal"]!
 var tax = Ordersdetail[0]["Tax"]!
 var shipping = Ordersdetail[0]["Shipping"]!
20.07.2017
  • Вы не должны использовать NSDictionary в Swift, но используйте родную альтернативу Swift, Dictionary. 20.07.2017
  • Да, это приемлемо. Я забыл исправить :) Спасибо. 20.07.2017

  • 2

    Привет, если вы хотите первый словарь этого

    self.orderdetailsArray
    

    тогда

    if let firstDictInfo = self.orderdetailsArray.first as? [String:Any] {
     // Do your stuff here
     print(firstDictInfo["OrderId"])
    }
    
    20.07.2017
  • в первом словаре, как мне нужно получить оставшиеся пары значений ключа, т.е. orderid, orderdate и т. д. 20.07.2017

  • 3

    Вместо того, чтобы перебирать весь словарь по словарям, вы должны просто взять первый словарь и проанализировать только его. В вашем коде было также довольно много других концептуальных проблем. В Swift не используйте NSDictionary, а используйте собственную версию Swift, Dictionary, которая хранит информацию о типе своего содержимого. Кроме того, используйте условное приведение, чтобы убедиться, что ваша программа не рухнет, даже если полученные данные неверны/неожиданны, и не используйте принудительную распаковку необязательных параметров.

    Кроме того, при анализе ответа JSON в Swift, как правило, нет необходимости и не рекомендуется перебирать пары ключ-значение словарей в ответе. Вы должны знать, какую структуру данных вы ожидаете, иначе вы не сможете правильно ее проанализировать, а поскольку вы можете напрямую обращаться к значениям словаря в Swift, если знаете ключ, которому он соответствует, нет необходимости повторять словарь в цикле.

    func downloadJsonWithURL() {
            let url = URL(string: self.url)
            URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) -> Void in
                if let jsonObj = (try? JSONSerialization.jsonObject(with: data!, options: .allowFragments)) as? [String:Any] {
                   guard let self.orderdetailsArray =  jsonObj["Orders detail"] as? [[String: AnyObject]] else {return}
                   guard let firstOrderDetails = self.orderdetailsArray.first else {return}
                   let key = "OrderId"
                   let value = "#1000501"
                   if let ordered = firstOrderDetails["OrderId] as? String {
                       self.orderid.append(orderid)
                   }
                   if let orderdate = firstOrderDetails["OrderDate"] as? String{
                       self.orderdate.append(orderdate)
                   }
                   if let subtotal = firstOrderDetails["SubTotal"] as? Int{
                       self.subTotal.append(subtotal)
                   }
                   if let shipping = firstOrderDetails["Shipping"] as? Int{
                       self.shippingPrice.append(shipping)
                   }
                   if let tax = firstOrderDetails["Tax"] as? Int{
                      self.tax.append(tax)
                   }
                   if let grandtotal = firstOrderDetails["GrandTotal"] as? Int{
                      self.grandTotal.append(grandtotal)
                   }
                   if let shippingAddress = firstOrderDetails[ "ShippingAddress"] as? AnyObject{ //why don't you store it as a String?
                      self.shippingAddress.append(shippingAddress)
                   }
                   if let shippingMethod = firstOrderDetails[ "ShippingMethod"] as? AnyObject{
                      self.shippingMethod.append(shippingMethod)
                   }
                   if let billingAddress = firstOrderDetails[ "BillingAddress"] as? AnyObject {
                      self.billingAddress.append(billingAddress)
                   }
                   if let paymentMethod = firstOrderDetails ["PayMentMethod"] as? AnyObject{
                      self.paymentMethod.append(paymentMethod)
                   }
                   guard let itemDetails = firstOrderDetails["Items detail"] as? [[String : AnyObject]] else {return}
                   self.itemsArray = itemDetails
                        }
                    }
                    }
                    OperationQueue.main.addOperation({
                        self.tableDetails.reloadData()
                    })
                }
            }).resume()
        }
    

    Я не компилировал и не запускал код, поэтому обязательно проверьте наличие опечаток/несоответствий. Кроме того, убедитесь, что вы изменили типы объектов, которые вы храните, на AnyObjects на определенные типы.

    20.07.2017
    Новые материалы

    Введение в контекст React
    В этом посте мы поговорим о Context API, который был представлен в React 16, и о том, как вы можете их использовать. Что такое контекст? Глядя на определение из react docs , оно..

    Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
    Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

    Это оно
    Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

    7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
    Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

    Базовое руководство по переносу концепций обучения в глубокое обучение
    Обзор По мере того, как машинное обучение становится все более мощным и продвинутым, модели, обеспечивающие эту расширенную возможность, становятся все больше и начинают требовать огромного..

    C в C.R.U.D с использованием React-Redux
    Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

    5 обязательных элементов современного инструмента конвейера данных
    В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..