如何解析Swift 3中的JSON数据?
问题描述:
我需要在Swift 3中通过PHP从mySQL获取我的GPS位置。我试图编写获取数据的代码,但它仍然不起作用,您能否告诉我?如何解析Swift 3中的JSON数据?
JSON从PHP数据:
[{ “ID”: “3752”, “纬度”: “11.2222”, “经度”: “111.2222”, “速度”: “0.000000”,”伏 “:” 3.97" , “百分比”: “87.000000”, “日期”: “2017年3月7日22时53分32秒”}]
夫特3代码:
import UIKit
//-------- import google map library --------//
import GoogleMaps
import GooglePlaces
class ViewController: UIViewController , GMSMapViewDelegate {
var placesClient: GMSPlacesClient!
override func viewDidLoad() {
super.viewDidLoad()
var abc : String = String()
//-------- Google key for ios --------//
GMSServices.provideAPIKey("XXXXXXXXXX")
GMSPlacesClient.provideAPIKey("XXXXXXXXX")
//--------set URL --------//
let myUrl = URL(string: "http://www.myweb/service.php");
var request = URLRequest(url:myUrl!)
request.httpMethod = "POST"
let postString = "";
request.httpBody = postString.data(using: String.Encoding.utf8);
let task = URLSession.shared.dataTask(with: request) { (data: Data?, response: URLResponse?, error: Error?) in
if error != nil
{
print("error=\(error)")
return
}
// You can print out response object
print("response = \(response)")
do {
let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as? NSDictionary
if let parseJSON = json {
// Now we can access value of latiutde
let latitude= parseJSON["latitude"] as? String //<---- Here , which i need latitude value
print("latitude = \(latitude)")
}
} catch {
print(error)
}
}
task.resume()
}
我试图编写代码,但它显示调试输出上的错误
let responseString = String(data: data, encoding: .utf8)
let str = String(data: data, encoding: .utf8)
let data2 = str?.data(using: String.Encoding.utf8, allowLossyConversion: false)!
do {
let json = try JSONSerialization.jsonObject(with: data2!, options: []) as! [String: AnyObject]
if let names = json["latitude"] as? [String] {
print(names)
}
} catch let error as NSError {
print("Failed to load: \(error.localizedDescription)")
}
}
错误消息
无法投型的值 '__NSSingleObjectArrayI'(0x1065fad60)至 '的NSDictionary'(0x1065fb288)。
答
尝试将json对象直接转换为Swift表示,以便更底层数据的“Swifty”访问。所以,你不必大惊小怪周围的NSNumber等
guard let json = JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [[String: String]] else { return }
guard json.count > 0 else { return }
guard let lattitude = json[0]["lattitude"] else { return }
print("Lattitude received: \(lattitude)")
如果你不知道你有一个[String: String]
对象数组,你可以用中投[String: Any]
替换它,那么你需要do是在读取格子时用可选的cast来检查类型。您可以添加一个链接选项,然后检查isEmpty
以检查其是否需要或者出错。
我也建议几乎不会在代码中使用!
,尝试更多地依赖可选的链接和保护语句。
注:单行后卫语句不是很详细,可能使其很难调试应用程序。考虑抛出错误或在guard语句的主体中进行更多的调试打印。
定义“不起作用”。 – rmaddy
另外:http://stackoverflow.com/q/38155436/2415822 – JAL
a l a m o f i r e –