Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从谷歌地理编码API Swift解码Json数据_Swift_Xcode_Google Maps_Geocoding_Google Geocoding Api - Fatal编程技术网

如何从谷歌地理编码API Swift解码Json数据

如何从谷歌地理编码API Swift解码Json数据,swift,xcode,google-maps,geocoding,google-geocoding-api,Swift,Xcode,Google Maps,Geocoding,Google Geocoding Api,我向google geocoding api发送一个地址字符串,以获得该地址的经度和纬度,然而,当我获得JSON数据时,我正在努力解码返回的JSON数据。我认为数据应该放在一个结构中,但是由于数据中有不同的数组,我不知道如何构造它 获取地理编码位置的代码: func longLatLookUp() { let url = URL(string: "https://maps.googleapis.com/maps/api/geocode/json?ad

我向google geocoding api发送一个地址字符串,以获得该地址的经度和纬度,然而,当我获得JSON数据时,我正在努力解码返回的JSON数据。我认为数据应该放在一个结构中,但是由于数据中有不同的数组,我不知道如何构造它

获取地理编码位置的代码:

func longLatLookUp() {
        
         let url = URL(string: "https://maps.googleapis.com/maps/api/geocode/json?address=10+Princes+Street+Edinburgh+Scotland&key={ API key }")!

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }
            print(String(data: data, encoding: .utf8)!)
        }
        task.resume()
        
    }
控制台返回:

{
   "results" : [
      {
         "address_components" : [
            {
               "long_name" : "10",
               "short_name" : "10",
               "types" : [ "street_number" ]
            },
            {
               "long_name" : "Princes Street",
               "short_name" : "Princes St",
               "types" : [ "route" ]
            },
            {
               "long_name" : "Edinburgh",
               "short_name" : "Edinburgh",
               "types" : [ "postal_town" ]
            },
            {
               "long_name" : "Edinburgh",
               "short_name" : "Edinburgh",
               "types" : [ "administrative_area_level_2", "political" ]
            },
            {
               "long_name" : "Scotland",
               "short_name" : "Scotland",
               "types" : [ "administrative_area_level_1", "political" ]
            },
            {
               "long_name" : "United Kingdom",
               "short_name" : "GB",
               "types" : [ "country", "political" ]
            },
            {
               "long_name" : "EH2 2AN",
               "short_name" : "EH2 2AN",
               "types" : [ "postal_code" ]
            }
         ],
         "formatted_address" : "10 Princes St, Edinburgh EH2 2AN, UK",
         "geometry" : {
            "location" : {
               "lat" : 55.95357130000001,
               "lng" : -3.1900314
            },
            "location_type" : "ROOFTOP",
            "viewport" : {
               "northeast" : {
                  "lat" : 55.95492028029151,
                  "lng" : -3.188682419708498
               },
               "southwest" : {
                  "lat" : 55.95222231970851,
                  "lng" : -3.191380380291502
               }
            }
         },
         "place_id" : "ChIJweMPNY7Hh0gRWMp_nlFlOO0",
         "plus_code" : {
            "compound_code" : "XR35+CX Edinburgh, UK",
            "global_code" : "9C7RXR35+CX"
         },
         "types" : [ "street_address" ]
      }
   ],
   "status" : "OK"
}
编辑: plus_代码可以是nil,所以我将其更改为可选

struct Response: Decodable {
    let results: [Component]
    let status: String

    struct Component: Decodable {
        let address_components: [Address]
        let formatted_address: String
        let geometry: Geometry
        let place_id: String
        let plus_code: PlusCode?
        let types: [String]
    }

    struct Address: Decodable {
        let long_name: String
        let short_name: String
        let types : [String]
    }

    struct Geometry: Decodable {
        let location: Location
        let location_type: String
        let viewport: Viewport
    }

    struct Viewport: Decodable {
        let northeast: Location
        let southwest: Location
    }

    struct PlusCode: Decodable {
        let compound_code: String
        let global_code: String
    }

    struct Location: Decodable {
        let lat: Float
        let lng: Float
    }
}
您可以对数据进行如下解码:

let json = try! JSONDecoder().decode(Response.self, from: data)

将您的JOSN粘贴到中,它将帮助您学习如何构建结构。谢谢!这是一个很大的帮助,帮助我更好地理解结构和解码JSON数据。感谢这个结构的结构真的帮助了我!然而,我需要为每一个添加一个CodingKeys枚举以使其工作。很高兴听到它的帮助!但它不需要CodingKeys,因为所有属性名都与JSON键匹配。