我尝试对看起来像这样的JSON进行解压缩:
{
"access_token": "This_is_my_token"
"item01": "blabla"
"item02": "blabla"
...
}
我只想将access_token
保存到变量中。没什么大不了的。例如,使用PHP非常简单,例如:
<?php
$jsonObj = json_decode($jsonString);
$access_token = $jsonObj["access_token"];
?>
但使用 Swift 看起来并不容易。我尝试了很多事情,但对我不起作用。
这是我的代码:
dataString = String(data: data, encoding: .utf8)!
do {
let anyObj: AnyObject? = try JSONSerialization.jsonObject(with: dataString, options: JSONSerialization.ReadingOptions([])) as AnyObject
guard let access_token = anyObj?.firstItem as? [String: AnyObject]
else {return}
print(access_token)
} catch {
print("JSON Deserial. Error")
}
使用此代码,我无法像在 PHP 中操作$jsonObj
那样操作anyObj
,没有办法做类似 anyObj["access_token"]
如何访问对象中的此项目?
谢谢
您可以通过在此处传递数据来简单地调用此函数,它将返回一个字典。从该字典中,您可以选择access_token值。
class func parseJsonToDictionary(data: Data) -> ([String:AnyObject]?,Error?) {
let _ = NSString(data: data, encoding:String.Encoding.utf8.rawValue)
do {
let JSONObject = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
return (JSONObject as? [String:AnyObject],nil)
} catch let error as NSError {
return (nil,error)
}
}
如果您有 json 字符串而不是 json 数据,则可以使用此方法将其转换为字典。
func convertToDictionary(text: String) -> [String: Any]? {
if let data = text.data(using: .utf8) {
do {
return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
} catch {
print(error.localizedDescription)
}
}
return nil
}
let str = "{"name":"James"}"
let dict = convertToDictionary(text: str)
稍后您可以从字典中获取access_token的值。
与其强制转换anyObj to AnyObject
不如尝试将其转换为字符串字典,例如
let anyObj: AnyObject? = try JSONSerialization.jsonObject(with: dataString, options: JSONSerialization.ReadingOptions([])) as [String:String]
然后,您可以使用anyObj["access_token"]
获取访问令牌