如何从 JSON 响应中检索特定数据?
How to retrieve specific data from JSON response?
目前,我正在使用 Google 地图距离矩阵 API,当我 运行 以下代码时得到以下结果:
func configureRoute(origin:String,destination:String){
let jsonURL = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=place_id:\(origin)&destinations=place_id:\(destination)&key=MYAPIKEY"
guard let url = URL(string: jsonURL ) else {return}
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else {return}
let dataAsString = String(data: data, encoding: .utf8)
print(dataAsString)
}.resume()
}
这是结果:
Optional("{\n \"destination_addresses\" : [ \"Pittsburgh, PA, USA\" ],\n \"origin_addresses\" : [ \"Philadelphia, PA, USA\" ],\n \"rows\" : [\n {\n \"elements\" : [\n {\n \"distance\" : {\n \"text\" : \"305 mi\",\n \"value\" : 490750\n },\n \"duration\" : {\n \"text\" : \"4 hours 48 mins\",\n \"value\" : 17257\n },\n \"status\" : \"OK\"\n }\n ]\n }\n ],\n \"status\" : \"OK\"\n}\n")
但是根据这个结果,我只想得到距离的持续时间,在本例中是 4 小时 48 分钟。我怎么只得到持续时间?
在尝试了一些建议后,我放置了 JSON url 以获得格式化的结构并得到以下结果:
struct Welcome: Codable {
let destinationAddresses, originAddresses: [String]
let rows: [Row]
let status: String
enum CodingKeys: String, CodingKey {
case destinationAddresses = "destination_addresses"
case originAddresses = "origin_addresses"
case rows, status
}
}
struct Row: Codable {
let elements: [Element]
}
struct Element: Codable {
let distance, duration: Distance
let status: String
}
struct Distance: Codable {
let text: String
let value: Int
}
使用它,我实现了以下代码:
func configureRoute(origin:String,destination:String){
let jsonURL = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=place_id:\(origin)&destinations=place_id:\(destination)&key=MYAPIKEY"
guard let url = URL(string: jsonURL ) else {return}
print(jsonURL)
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else {return}
do{
let route = try JSONDecoder().decode(Element.self, from: data)
print (route.duration)
}
catch let jsonErr{
}
let dataAsString = String(data: data, encoding: .utf8)
// print(dataAsString)
}.resume()
}
但是我 route.duration 的结果仍然没有。
使用 SwiftyJSON:
进口SwiftyJSON
func configureRoute(origin:String,destination:String){
let jsonURL = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=place_id:\(origin)&destinations=place_id:\(destination)&key=MYAPIKEY"
guard let url = URL(string: jsonURL ) else {return}
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else {return}
let dataAsString = String(data: data, encoding: .utf8)
if let json = JSON(data: data){
if let durationValue = json["rows"][0]["elements"][0]["duration"]["value"].int32 {
//This is duration seconds, 17257
}
if let durationText = json["rows"][0]["elements"][0]["duration"]["text"].stringValue {
//this is duration text, 4 hours 48 mins
}
print(dataAsString)
}.resume()
}
将您的 JSON 回复粘贴到以下在线 json 到 swift 结构转换器中。
JSON String to Swift struct converter
{
"name": "John",
"age": 31,
"city": "New York"
}
现在复制生成的结构。
struct JSON: Codable {
let name: String
let age: Int
let city: String
}
解码您的数据响应。不要忘记 try catch 和错误处理
let jsonRespone:JSON = try JSONDecoder().decode(JSON.self, data);
现在您可以使用您的结构访问数据。如果您的 JSON 响应包含一些并不总是存在的信息(例如错误消息),只需将您的 JSON 结构或该特定键设为可选即可。
let cityName:String = jsonResponse.city
let age:Int = jsonResponse.age
let name:String = jsonResponse.name
目前,我正在使用 Google 地图距离矩阵 API,当我 运行 以下代码时得到以下结果:
func configureRoute(origin:String,destination:String){
let jsonURL = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=place_id:\(origin)&destinations=place_id:\(destination)&key=MYAPIKEY"
guard let url = URL(string: jsonURL ) else {return}
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else {return}
let dataAsString = String(data: data, encoding: .utf8)
print(dataAsString)
}.resume()
}
这是结果:
Optional("{\n \"destination_addresses\" : [ \"Pittsburgh, PA, USA\" ],\n \"origin_addresses\" : [ \"Philadelphia, PA, USA\" ],\n \"rows\" : [\n {\n \"elements\" : [\n {\n \"distance\" : {\n \"text\" : \"305 mi\",\n \"value\" : 490750\n },\n \"duration\" : {\n \"text\" : \"4 hours 48 mins\",\n \"value\" : 17257\n },\n \"status\" : \"OK\"\n }\n ]\n }\n ],\n \"status\" : \"OK\"\n}\n")
但是根据这个结果,我只想得到距离的持续时间,在本例中是 4 小时 48 分钟。我怎么只得到持续时间?
在尝试了一些建议后,我放置了 JSON url 以获得格式化的结构并得到以下结果:
struct Welcome: Codable {
let destinationAddresses, originAddresses: [String]
let rows: [Row]
let status: String
enum CodingKeys: String, CodingKey {
case destinationAddresses = "destination_addresses"
case originAddresses = "origin_addresses"
case rows, status
}
}
struct Row: Codable {
let elements: [Element]
}
struct Element: Codable {
let distance, duration: Distance
let status: String
}
struct Distance: Codable {
let text: String
let value: Int
}
使用它,我实现了以下代码:
func configureRoute(origin:String,destination:String){
let jsonURL = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=place_id:\(origin)&destinations=place_id:\(destination)&key=MYAPIKEY"
guard let url = URL(string: jsonURL ) else {return}
print(jsonURL)
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else {return}
do{
let route = try JSONDecoder().decode(Element.self, from: data)
print (route.duration)
}
catch let jsonErr{
}
let dataAsString = String(data: data, encoding: .utf8)
// print(dataAsString)
}.resume()
}
但是我 route.duration 的结果仍然没有。
使用 SwiftyJSON:
进口SwiftyJSON
func configureRoute(origin:String,destination:String){
let jsonURL = "https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=place_id:\(origin)&destinations=place_id:\(destination)&key=MYAPIKEY"
guard let url = URL(string: jsonURL ) else {return}
URLSession.shared.dataTask(with: url) { (data, response, err) in
guard let data = data else {return}
let dataAsString = String(data: data, encoding: .utf8)
if let json = JSON(data: data){
if let durationValue = json["rows"][0]["elements"][0]["duration"]["value"].int32 {
//This is duration seconds, 17257
}
if let durationText = json["rows"][0]["elements"][0]["duration"]["text"].stringValue {
//this is duration text, 4 hours 48 mins
}
print(dataAsString)
}.resume()
}
将您的 JSON 回复粘贴到以下在线 json 到 swift 结构转换器中。 JSON String to Swift struct converter
{ "name": "John", "age": 31, "city": "New York" }
现在复制生成的结构。
struct JSON: Codable { let name: String let age: Int let city: String }
解码您的数据响应。不要忘记 try catch 和错误处理
let jsonRespone:JSON = try JSONDecoder().decode(JSON.self, data);
现在您可以使用您的结构访问数据。如果您的 JSON 响应包含一些并不总是存在的信息(例如错误消息),只需将您的 JSON 结构或该特定键设为可选即可。
let cityName:String = jsonResponse.city let age:Int = jsonResponse.age let name:String = jsonResponse.name