Json разбор стремительный, не получается распечатать - PullRequest
2 голосов
/ 28 января 2020

Я новичок в Свифте. Я хочу получить json данные с сервера, используя URL-адрес. Я пробовал много другого решения, но оно не могло работать. Я хочу напечатать ключ Duration (текст и значение) из массива, а затем распечатать его в консоли. PFA ниже ... Любая помощь приветствуется. Спасибо и всего наилучшего

Данные Json прикреплены ниже

{
    "status": "OK",
    "rows": [
        {
            "elements": [
                {
                    "duration": {
                        "text": "3 hours 49 mins",
                        "value": 13725
                    },
                    "distance": {
                        "text": "225 mi",
                        "value": 361715
                    },
                    "status": "OK"
                }
            ]
        }
    ],
    "origin_addresses": [
        "Washington, DC, USA"
    ],
    "destination_addresses": [
        "New York, NY, USA"
    ]
}

Прикрепленный код

func getdatajson1(){

        if let url = URL(string: "http://www.json-generator.com/api/json/get/bQywstyfkO?indent=2") {
            URLSession.shared.dataTask(with: url) { data, response, error in
                if let data = data {
                    do {
                        let res = try JSONDecoder().decode(Root.self, from: data)
                        print(res.rows)
                    } catch let error {
                        print(error)
                    }
                }
                }.resume()
        }

    } 



 struct Root: Codable {
        let rows: [Root2]
    }


    struct Root2: Codable {
        let elements: [Root3]
    }

    struct Root3: Codable {
        let elements: [node]
    }



    struct node: Codable {
        let duration : [valuesarray]

    }

    struct valuesarray: Codable {
        let text : String 
        let value : Int
    }

Ответы [ 4 ]

1 голос
/ 28 января 2020

duration - это Object, а не Array, также измените свои имена, и вы можете использовать это:

struct Root: Decodable {

  let rows: [Rows]

}

struct Rows: Decodable {

 let elements: [Elements]

}

struct Elements: Decodable {

  let duration, distance: LocationValues
}

struct LocationValues: Decodable {
   let text: String
   let value: Int
}

func getdatajson1(){

        if let url = URL(string: "http://www.json-generator.com/api/json/get/bQywstyfkO?indent=2") {
            URLSession.shared.dataTask(with: url) { data, response, error in
                if let data = data {
                    do {
                        let res = try JSONDecoder().decode(Root.self, from: data)
                        if let row = res.rows.first, let elements = row.elements.first {
                            print(elements.duration.text) //This is how you can get the text value
                            print(elements.distance.text) //This will print the distance
                        }

                    } catch let error {
                        print(error)
                    }
                }
                }.resume()
        }

    } 
0 голосов
/ 28 января 2020

попробуйте это:

и подсказку: go до https://app.quicktype.io/ -> здесь вы можете вставить json, и вы получите свои данные бесплатно! ;)

func getdatajson1(){

            if let url = URL(string: "http://www.json-generator.com/api/json/get/bQywstyfkO?indent=2") {
                URLSession.shared.dataTask(with: url) { data, response, error in
                    if let data = data {
                        do {

                            let res = try JSONDecoder().decode(Welcome.self, from: data)
                            print(res.rows)
                        } catch let error {
                            print(error)
                        }
                    }
                }.resume()
            }

        }

        getdatajson1()


       struct Welcome: Codable {
            let status: String
            let rows: [Row]
            let originAddresses, destinationAddresses: [String]

            enum CodingKeys: String, CodingKey {
                case status, rows
                case originAddresses = "origin_addresses"
                case destinationAddresses = "destination_addresses"
            }
        }

        // MARK: - Row
        struct Row: Codable {
            let elements: [Element]
        }

        // MARK: - Element
        struct Element: Codable {
            let duration, distance: Distance
            let status: String
        }

        // MARK: - Distance
        struct Distance: Codable {
            let text: String
            let value: Int
        }
0 голосов
/ 28 января 2020

Вам следует обновить node модель, как показано ниже

struct node: Codable {
     let duration : valuesarray
     let distance : valuesarray
     let status : String
}

И вы можете получить доступ к своим duration данным из ответа API, как показано ниже

if let rows = res.rows, rows.count > 0 {

      //Access the element objects from rows
      let arrElements = rows[0].elements, arrElements.count > 0 {

          if let durationData = arrElements[0].duration { //get your duration object
               print(durationData.text)
               print(durationData.value)
          }
      }
}
0 голосов
/ 28 января 2020

Замените свою кодируемую структуру на следующую

class Result: Codable {
    var status:String?
    var rows:[Row]?
    var origin_addresses:[String]?
    var destination_addresses:[String]?
}

class Row: Codable {
    var elements:[Element]?
}

class Element: Codable {
    var status:String?
    var duration:Duration?
    var distance:Distance?
}

class Duration: Codable {
    var text:String?
    var value:Int?
}

class Distance: Codable {
    var text:String?
    var value:Int?
}
...