反序列化JSON反对
问题描述:
我尝试deseralize我的JSON看起来像这样:反序列化JSON反对
{
"access_token": "This_is_my_token"
"item01": "blabla"
"item02": "blabla"
...
}
,我想只有access_token
保存到一个变量。没什么大不了的。 对于为例,用PHP是很简单的东西,如:
<?php
$jsonObj = json_decode($jsonString);
$access_token = $jsonObj["access_token"];
?>
但它看起来并不如此简单与斯威夫特。我尝试了很多东西,但没有为我工作。
这里是我的代码:
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")
}
与此代码,我无法操纵anyObj
就像我在PHP $jsonObj
做,没有办法做这样的事情anyObj["access_token"]
如何我可以访问该对象中的这个项目吗?
感谢
答
得到的accessToken您只需通过传递调用这个函数您数据在这里,它会返回一个字典。从该字典中您可以选择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)
}
}
答
代替铸造anyObj to AnyObject
的尝试铸造为字符串的字典一样
let anyObj: AnyObject? = try JSONSerialization.jsonObject(with: dataString, options: JSONSerialization.ReadingOptions([])) as [String:String]
然后,你可以通过使用anyObj["access_token"]
+0
它不工作,因为'.jsonObject'生成'Any',所以它不会编译 – LeCintas
答
如果您有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的值。
我看起来很不错,但是当我打印(json.0 [“access_token”])输出是'Optional (my_super_access_token)'而不是'my_super_access_token',你知道为什么吗? – LeCintas
只需使用,如果让和解压缩它。然后它将删除可选。 – vikram