Swift : JSONSerialization. jsonObject 无法将 json 转换为 json

标签 swift xcode json-serialization

我正在使用此代码从 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"]
}

注释

  1. 使用 Swift 4 或更高版本时,您应该使用 Codable 协议(protocol)
  2. 你不应该强制解包,使用条件解包(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/

相关文章:

flutter json_serializable tojson 无法正常工作

ios - 当我在 swift 中输入文本字段时移动小数点

swift - 在 Swift 中阻止保留循环?

ios - 第一次未设置 UITableview 单元格标签字体大小

ios - 如何使用 swift 3 xcode 8 在核心数据中预加载数据库

Xcode 调试 : how to view xmm registers in readable form

json - 在 JsonSerialization 中为特定的 Json 响应转换 JSON 响应的内容

ios - 带麦克风的 Swift iOS 实时音频处理

xcode - 添加到 xcode 项目的文件在另一台 Mac 上显示为红色

json.net - 牛顿软件 JSON : TypeNameHandling - $type purpose