我在快速获取JSON值时遇到问题。
{
"meta": {"expiration": 0,"flags": 33456},
"json": "{\"key\":\"string\",\"value\":{\"failed_attempts\":\"1\"}}",
"xattrs": {}
}
我尝试过的代码
if let resultData = responseBody["json"] as? [String: AnyObject]{
if let val = resultData["value"] as? [String: AnyObject]{
if let attempt = val["failed_attempt"] as? String {
print(attempt)
}
}
}
我尝试打印以下行,它可以正确打印json数组内的所有对象,但是当我尝试将返回类型添加为[String:AnyObject]时,它将返回nil值。有人可以给我一些建议。
response [“ json”]
答案 0 :(得分:1)
将AnyObject
替换为Any
。字典是结构,而不是对象,因此强制转换将失败。
我还建议将来学习有关Codable来处理JSON的信息。
编辑:
您首先需要将数据序列化为JSON对象。 Data
类不会自动转换为JSON。
do {
let jsonRoot = try JSONSerialization.jsonObject(with: responseBody, options: []) as! [String: Any]
if let json = jsonRoot["json"] as? [String: Any],
let val = json["value"] as? [String: Any],
let attempt = val["failed_attempt"] as? String {
print(attempt)
}
} catch {
print("Invalid data", error)
}
答案 1 :(得分:0)
最好的方法是使用Codable
,这就是为什么,根据您的JSON字符串,我创建了Codable
结构。
JSONString应该是:
let jsonString = """
{ "meta": { "expiration":0, "flags":33456 },
"json": { "key":"String",
"value":{ "failed_attempt":"3" },
},
"xattrs":{ "someAttribute":"someValue"}
}
"""
结构:
struct Response: Codable {
var meta: MetaData
var json: JSONResponse
var xattrs: Xattrs?
}
struct MetaData: Codable {
var expiration: Int
var flags: Int
}
struct JSONResponse: Codable {
var key: String
var value: JSONValue
}
struct JSONValue: Codable {
var failed_attempt: String
}
struct Xattrs: Codable {
var someAttribute: String
}
if let jsonData = jsonString.data(using: .utf8)
{
let myStruct = try? JSONDecoder().decode(Response.self, from: jsonData)
print(myStruct?.json.value.failed_attempt)
}