【问题标题】:Casting JSON data in Swift在 Swift 中转换 JSON 数据
【发布时间】:2014-06-20 23:00:45
【问题描述】:

我从已解析为字典的服务器获取一些 JSON 数据。现在我想从字典中获取数据并将其转换为不同的类型,但我遇到了一些错误。

我试过了

let manager = AFHTTPRequestOperationManager()
manager.requestSerializer = AFJSONRequestSerializer()
manager.GET(
    "http://localhost/example/jsonpage",
    parameters: nil,
    success: { (operation: AFHTTPRequestOperation!,
        responseObject: AnyObject!) in

        if let data = responseObject as? Dictionary<String, AnyObject> {
            let id = data["id"] as? Int
            let persons = data["persons"] as? Dictionary<String, AnyObject>
        }


    },
    failure: { (operation: AFHTTPRequestOperation!,
        error: NSError!) in
        println("Error: " + error.localizedDescription)
    }
)

这些给了我一个错误:

let id = data["id"] as? Int
let persons = data["persons"] as? Dictionary<String, AnyObject>

错误: Could not find an overload for 'subscript' that accepts the supplied arguments

【问题讨论】:

  • 你能告诉我们你是如何解析 JSON 的吗?
  • 用更多代码更新了问题。

标签: json swift


【解决方案1】:

responseObject 的类型为NSDictionary,支持的 JSON 值类型为 NSDictionary、NSArray、NSString、NSNumber。转换为 Dictionary 不会将其值转换为正确的类型。您必须单独转换值。

if let nsid: NSNumber = data["id"] as? NSNumber {
    var id = Int(nsid)
}

【讨论】:

  • if let nsid = data["id"] as? NSNumber {处给出fatal error: value failed to bridge from Objective-C type to a Swift type的错误
  • @Oskar 我在上面进行了更正。现在应该可以工作了。
【解决方案2】:

分别向 NSNumber 或 NSDictionary 添加中间转换可解决错误并准确实现您想要的转换:

let id = data["id"] as? NSNumber as? Int
let persons = data["persons"] as? NSDictionary as? [String: AnyObject]

【讨论】:

    【解决方案3】:

    您将responseObject 输入为Dictionary&lt;String, AnyObject&gt; — 这意味着该字典只能包含 objects 作为值;但是Int 不是对象而是结构体。

    因此,您只需要改用Any 重写您的代码(Any 是代表任何对象或结构的类):

    if let data = responseObject as? Dictionary<String, Any> {
        let id = data["id"] as? Int
        let persons = data["persons"] as? Dictionary<String, Any>
    }
    

    【讨论】:

    • 这给了我一个错误,在let id...fatal error: value failed to bridge from Objective-C type to a Swift typelet persons... 上说let persons...
    • 啊,应该运行它。 iOS JSON 将 NSNumbers 用于整数等。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 1970-01-01
    • 2015-01-06
    • 2017-01-27
    相关资源
    最近更新 更多