【问题标题】:How to access multiple NSDictionary after JSON decodedJSON解码后如何访问多个NSDictionary
【发布时间】:2018-08-21 05:19:24
【问题描述】:

在 JSONSerialization 解码并将as! 转换为 NSDictionary 后,获取以下数据。

{
    language = {
        A00001 = {
            chineseSimplified = CIMB;
            chineseTraditional = CIMB;
            english = CIMB;
            japanese = CIMB;
            korean = CIMB;
        };
    };
}

如何访问嵌套的 NSDictionary?

我能够通过data["language"] 获取一层数据,但我无法访问多个层,例如:

data["language"]["A00001"]["english"]
data["language"]?["A00001"]?["english"]?
data["language"]!["A00001"]!["english"]!

Xcode 返回此错误:

类型 'Any' 没有下标成员

参考类似问题: How to access deeply nested dictionaries in Swift Accessing Nested NSDictionary values in Swift 3.0 How do I manipulate nested dictionaries in Swift, e.g. JSON data?

【问题讨论】:

  • 请提供指向 JSON 文件或 URL 的链接...
  • 在 Swift 4 Codable 中使用最新的 API 怎么样?
  • 你不应该在 Swift 中使用NSDictionary。使用 Swift 字典。有无数示例展示了在 Swift 中使用 JSON 的正确方法。并请搜索错误。 “Type 'Any' has no subscript members”这个错误已经在这里讨论过很多次了。

标签: ios swift nsdictionary swift4


【解决方案1】:

尝试将其转换为 [String: [String: [String: String]]],这是 Swift Dictionary 的嵌套结构。

let json = """
{
"language": {
    "A00001": {
        "chineseSimplified" : "CIMB",
        "chineseTraditional" : "CIMB",
        "english" : "CIMB",
        "japanese" : "CIMB",
        "korean" : "CIMB"
    }
    }
}
"""
if let jsonD = json.data(using: String.Encoding.utf8) {
    do {
        if let data = try JSONSerialization.jsonObject(with: jsonD, options: JSONSerialization.ReadingOptions.mutableLeaves) as? [String: [String: [String: String]]] {
            print(data["language"]!["A00001"]!["english"]!)
        }
    } catch let error {
        print(error.localizedDescription)
    }

}

这是另一个使用 Swift 4 的 Codable API 的答案。如果您的代码需要类型安全并且您确定 JSON 中的字段是一致的,我认为值得一试。

let json = """
{
"language": {
"A00001": {
"chineseSimplified" : "CIMB",
"chineseTraditional" : "CIMB",
"english" : "CIMB",
"japanese" : "CIMB",
"korean" : "CIMB"
}
}
}
"""
struct MyLanguages:Codable {
    struct LanguageGroup: Codable {
        struct Language:Codable {
            var chineseSimplified: String
            var chineseTraditional: String
            var english: String
            var japanese: String
            var korean: String
        }
        var A00001: Language

    }
    var language: LanguageGroup
}
if let jsonD = json.data(using: String.Encoding.utf8) {
    let jsonDecoder = JSONDecoder()
    do {
        let myLang = try jsonDecoder.decode(MyLanguages.self, from: jsonD)
        print(myLang.language.A00001.chineseSimplified)

    }
    catch let err {
        print(err.localizedDescription)
    }

}

【讨论】:

  • 感谢您的回答。无论如何,我想要任何格式的 JSON 解码。不固定为 struct 或 [ String: [String: String] ] 等 1 种格式。
猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
相关资源
最近更新 更多