访问嵌套的JSON数据

时间:2017-07-11 17:06:43

标签: json macos swift3

我正在使用RxSwift来帮助我在我的osx应用程序中实现异步HTTP请求。我的HTTP请求被建模为返回Observable<Any?>的流。返回的Any?值是根据HTTP响应中收到的数据创建的jsonObject:

let data = try? JSONSerialization.jsonObject(with: data)    
return Observable.just(data)

发出HTTP请求后,我订阅了流,等待下一个值到达。到达后,我会在继续之前将数据保存为[String: Any]

let onNextSubscription = httpResponse?.subscribe(onNext: { data in
    if let data = data as? [String: Any] {
        print(data)
        ...
    }
}

在这种情况下,我正在评估我的应用程序中的CheckVersion方法,以确保它是当前支持的版本。为了做到这一点,我呼吁发送一个服务,该服务发送回JSON数据,该数据关于当前支持哪些版本的应用程序,以及如果评估失败,在Web上找到它们的位置。然后,我将来自响应的数据与应用程序内的数据结合使用,以评估应用程序是否受支持并相应地继续。也就是说,我将比较JSON数据中的“minVersion”值和应用程序的版本,以确定CheckVersion方法的结果。

我从HTTP响应中收到的数据是:

["status": 0, "result": {
    "minVersion":"1.7.0",
    "currVersion":"2.0.0",
    "urls":{
        "2.0.0":"/downloads/app.2.0.0.exe",
        "1.9.0":"/downloads/app.1.9.0.exe",
        "1.8.0":"/downloads/app.1.8.0.exe",
        "1.7.0":"/downloads/app.1.7.0.exe",
    }
}]

我的下一步是从数据中检索“minVersion”值,因此我继续在上面显示的同一个if {...}块中:

let result = data["result"] as? [String: Any]
print(result)

let minVersion = result["minVersion"] as? String
print(minVersion)

...

我希望能够做的是在执行我的版本比较逻辑之前访问值result["minVersion];但是,我无法,因为data["result"] == nil之后它被转发为[String: Any]

data["result"]被强制转发为[String: Any]时,我收到以下错误:

  

无法将“__NSCFString”类型的值转换为“NSDictionary”。

我不确定为什么会这样,因为我在网上看过的其他帖子已经证明这是访问嵌套JSON数据的常用方法,尽管我可能会遗漏一些东西。

我最好的猜测是,它与result["urls"]值包含自己的jsonObject这一事实有关,而result的其他值只是字符串。

以下是我在编写代码时引用的一些文档:

  1. https://developer.apple.com/swift/blog/?id=37
  2. How to access nested JSON in brackets in Swift?
  3. 我是一名C#.NET开发人员,这是我第一次涉足OS X和Swift世界,所以提前感谢您的帮助以及对我的支持!

    编辑:以下是print(data [“result”])的结果:

    Optional({
        "minVersion":"1.7.0",
        "currVersion":"2.0.0",
        "urls":{
            "2.0.0":"/downloads/app.2.0.0.exe",
            "1.9.0":"/downloads/app.1.9.0.exe",
            "1.8.0":"/downloads/app.1.8.0.exe",
            "1.7.0":"/downloads/app.1.7.0.exe",
        }
    })
    

    编辑:根据Dan的要求,我尝试了https://stackoverflow.com/questions/30480672/...中列出的方法。

    let subNext = httpResponse?.subscribe(onNext: { data in
        if let data = data as? [String: Any] {
            print(data)
    
            let result = self.convertToDictionary(text: data["result"] as! String)
            print(result)
        }
    })
    

    结果是:

    Optional(["currVersion": 2.0.0, "urls": {
        "1.7.0" = "/downloads/app.1.7.0.exe",
        "1.8.0" = "/downloads/app.1.8.0.exe",
        "1.9.0" = "/downloads/app.1.9.0.exe",
        "2.0.0" = "/downloads/app.2.0.0.exe",
    }, "minVersion": 1.7.0])
    

    最终修改

    感谢Rob和Dan的评论,我能够解决我的问题。它基本上与https://stackoverflow.com/questions/30480672/...

    中显示的相同

    我会继续把这个标记为重复标记。

0 个答案:

没有答案
相关问题