我正在使用此代码从 url 获取 json 数据:
URLSession.shared.dataTask(with:request, completionHandler: { (data, response, error) in
guard let data = data, error == nil else { return }
do {
let json = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:String]
completion(json)
} catch _ as NSError {
completion(nil)
}
}).resume()
如果我的 json 是 {"error":"true","message":"no"}
它工作正常
但是如果我将 json 转化为 json,它就不起作用了:
{"error":"true","message":"no","state":{"id":"1","name":"empty"}}
最佳答案
使用作为! [String:String]
你是说字典中所有的值都是String类型,但是state key相关的嵌套JSON显然不是String
使用作为? [String: Any]
然后根据需要转换您的其他属性。 结果["error"] 为字符串
使用这种方法,获取嵌套数据比需要的更困难:
if let state = result["state"] as? [String: String] {
let name = state["name"]
let value = state["value"]
}
注释
- 使用 Swift 4 或更高版本时,您应该使用 Codable 协议(protocol)
- 你不应该强制解包,使用条件解包(
as?[String: Any]
)
编辑:
一个示例,说明如何使用 Codable 执行此操作以及如何使用它。
Playground 代码
// you dont need this part, I am not making network request
let jsonData = """
{"error":"true","message":"no","state":{"id":"1","name":"empty"}}
""".data(using: .utf8)
struct ErrorState: Codable
{
let id: String
let name: String
}
struct ErrorResponse: Codable
{
let error: String
let message: String
let state: ErrorState
}
guard let data = jsonData else { fatalError() }
let errorResponse = try? JSONDecoder().decode(ErrorResponse.self, from: data)
print(errorResponse?.state.name)
关于Swift : JSONSerialization. jsonObject 无法将 json 转换为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50019215/