Вернуть значение во вложенном массиве JSON, используя Alamofire и Swift - PullRequest
1 голос
/ 17 марта 2020

Супер новый для swift, JSON, и довольно все кодирование, поэтому я заранее извиняюсь, если этот вопрос является избыточным для других на сайте, или я упускаю что-то простое здесь.

Я хочу вернуться значение «text» («1,7 мили»), связанное с «distance» в массиве «elements» в приведенном ниже коде JSON:

{
   "destination_addresses" : [ "30 Rockefeller Plaza, New York, NY 10112, USA" ],
   "origin_addresses" : [ "352 7th Ave, New York, NY 10001, USA" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "1.7 mi",
                  "value" : 2729
               },
               "duration" : {
                  "text" : "15 mins",
                  "value" : 887
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

Я получил данные JSON, используя Alamofire и Google DistanceMatrix (см. мой код ниже), но у меня проблемы с анализом данных, чтобы изолировать то, что мне нужно. Я знаю, что приведенный ниже код не близок к тому, что мне нужно, но я не уверен, что делать дальше.

func distanceMatrix(startLocation: String, endLocation: String) {
        let myOrigin = startLocationTFText
        let myDestination = destinationLocationTFText

        let url = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=\(myOrigin)&destinations=\(myDestination)&key=API_Key

        let encodedUrl = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

        AF.request(encodedUrl!).responseJSON { response in
            print(response.request as Any)
            print(response.response as Any)
            print(response.data as Any)
            print(response.result as Any)

            let json = JSON(response.data as Any)

Любая помощь очень ценится. Спасибо.

1 Ответ

1 голос
/ 17 марта 2020

Вы можете использовать Decodable для получения желаемого результата.

struct RootResponse: Decodable {

   let destinationAddresses, originAddresses: [String]
   let rows: [Rows]
   let status: String
}

struct Rows: Decodable {

  let elements: [Elements]
}

struct Elements: Decodable {

  let distance, duration: Details
  let status: String
}

struct Details: Decodable {
   let text, value: String
}

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

func distanceMatrix(startLocation: String, endLocation: String) {
    let myOrigin = startLocationTFText
    let myDestination = destinationLocationTFText

    let url = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=\(myOrigin)&destinations=\(myDestination)&key=API_Key"

    let encodedUrl = url.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)

    AF.request(encodedUrl!).responseJSON { response in
        print(response.request as Any)
        print(response.response as Any)
        print(response.data as Any)
        print(response.result as Any)

        let decoder = JSONDecoder()
        decoder.keyDecodingStrategy = .convertFromSnakeCase

        guard let json = try? decoder.decode(RootResponse.self, from: response.data) else { print("Unable to parse JSON"); return }

        print(json)
        print(json.rows.first?.elements.first?.distance.value) // This is how you can get the value, but it will be better to safely unwrap them and I have also used first? to get the first object but this is an array and you can always use a for loop for further purpose
}
...