Json разбирать массив в словаре - PullRequest
0 голосов
/ 15 мая 2018

Я использую JSON API в моем приложении. Это может проверить, что компания действительно использует электронный Счет. У меня есть данные JSON, как это:

{
        "ErrorStatus": null,
        "Result": {
            "CustomerList": [
                {
                    "RegisterNumber": "6320036072",
                    "Title": "VATAN BİLGİSAYAR SANAYİ VE TİCARET ANONİM ŞİRKETİ",
                    "Alias": "urn:mail:defaultpk@vatanbilgisayar.com",
                    "Type": "Özel",
                    "FirstCreationTime": "2014-01-01T05:35:20",
                    "AliasCreationTime": "2014-01-01T05:35:20"
                }
            ],
            "ISEInvoiceCustomer": true
        }  }

и я использую эту функцию для получения данных JSON:

func getClientQuery(authorization:String) {

    let url = NSURL(string: URLCustomerCheck+strRegisterNumber)
    let request = NSMutableURLRequest(url: url! as URL)
    request.httpMethod = "GET"

    request.addValue(authorization, forHTTPHeaderField: "Authorization")

    let task = URLSession.shared.dataTask(with: request as URLRequest) { data,response,error in


        if error != nil {
            let alert = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
            let okButton = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
            alert.addAction(okButton)
            self.present(alert, animated: true, completion: nil)
        } else {

            if data != nil {

                do {

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

                    DispatchQueue.main.async {

                        print(jSONResult)

                        let result = jSONResult["Result"] as! [String:AnyObject]


                        //let customerList = result["CustomerList"] as! [[String:AnyObject]] 



                        let ISEInvoiceCustomer = String(describing: result["ISEInvoiceCustomer"])


                        self._lblISEinvoiceCustomer.text = " \(ISEInvoiceCustomer) "

                    }
                } catch {

                }
            }
        }
    }
    task.resume()
}

Мой вопрос: как я могу разобрать "RegisterNumber", "Title" .. в "CustomerList"? Это массив, в котором есть член. Однако я не могу разобрать это в моей функции.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018
let data = resultData
   do {
       guard let JSONResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String : AnyObject],
           let resultObject = JSONResult["Result"] as? [String : AnyObject],
           let customerList = resultObject["CustomerList"] as? [Anyobject] 
           else { return }

           // Loop the array of objects
           for object in customerList {
                let registerNumber = object["RegisterNumber"] as? String
                let title = object["Title"] as? String
                let alias = object["Alias"] as? String
                let type = object["Type"] as? String
                let firstCreationTime = object["FirstCreationTime"] as? String // Or as a DateObject
                let aliasCreationTime = object["AliasCreationTime"] as? String // Or as a DateObject
           }

           let isEInvoiceCustomer = resultObject["ISEInvoiceCustomer"] as? Bool

} catch {
     print(error)
}
0 голосов
/ 15 мая 2018

Лучше сопоставить JSON с моделью, это становится проще, используя Codable

 import Foundation
    struct Client: Codable {
        let errorStatus: ErrorStatus?
        let result: Result

        enum CodingKeys: String, CodingKey {
            case errorStatus = "ErrorStatus"
            case result = "Result"
        }
    }

    struct ErrorStatus: Codable {
    }

    struct Result: Codable {
        let customerList: [CustomerList]
        let iseInvoiceCustomer: Bool

        enum CodingKeys: String, CodingKey {
            case customerList = "CustomerList"
            case iseInvoiceCustomer = "ISEInvoiceCustomer"
        }
    }
    struct CustomerList: Codable {
        let registerNumber, title, alias, type: String
        let firstCreationTime, aliasCreationTime: String

        enum CodingKeys: String, CodingKey {
            case registerNumber = "RegisterNumber"
            case title = "Title"
            case alias = "Alias"
            case type = "Type"
            case firstCreationTime = "FirstCreationTime"
            case aliasCreationTime = "AliasCreationTime"
        }
    }
    // MARK: Convenience initializers

    extension Client {
        init(data: Data) throws {
            self = try JSONDecoder().decode(Client.self, from: data)
        }

        init(_ json: String, using encoding: String.Encoding = .utf8) throws {
            guard let data = json.data(using: encoding) else {
                throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
            }
            try self.init(data: data)
        }

    }

Получить customerList:

 func getClientQuery(authorization:String) {

        let url = NSURL(string: URLCustomerCheck+strRegisterNumber)
        let request = NSMutableURLRequest(url: url! as URL)
        request.httpMethod = "GET"

        request.addValue(authorization, forHTTPHeaderField: "Authorization")

        let task = URLSession.shared.dataTask(with: request as URLRequest) { data,response,error in


            if error != nil {
                let alert = UIAlertController(title: "Error", message: error?.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
                let okButton = UIAlertAction(title: "OK", style: UIAlertActionStyle.cancel, handler: nil)
                alert.addAction(okButton)
                self.present(alert, animated: true, completion: nil)
            } else {

                if data != nil {
                    if let client  = try? Client.init(data: data){
                        client.result.customerList.forEach { (customer) in
                            print(customer.registerNumber)
                        }
                    }

                }
            }
        }
        task.resume()
    }
0 голосов
/ 15 мая 2018

Комментируемая вами строка customerList необходима.Затем выполните итерацию этого массива и извлеките любые значения из каждого словаря.

И вам действительно следует избегать нас as! или любых других принудительных развертываний при работе с JSON.Вы не хотите, чтобы ваше приложение зависало при получении неожиданных данных.

И никогда не используйте String(describing:) для создания значения, которое вы будете отображать для пользователя.Результат не подходит для отображения.Он используется только для отладки.

if let jSONResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? [String:Any]
    DispatchQueue.main.async {
        print(jSONResult)

        if let result = jSONResult["Result"] as? [String:AnyObject],
           let customerList = result["CustomerList"] as? [[String:Any]] {
            for customer in customList {
                let registrationNumber = customer["RegisterNumber"]
                // and any others you need
            }

            let ISEInvoiceCustomer = result["ISEInvoiceCustomer"] as? Bool ?? false
            self._lblISEinvoiceCustomer.text = ISEInvoiceCustomer) ? "Yes" : "No"
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...