【问题标题】:Swift Searching For Values inside values of Dictionary快速搜索字典值中的值
【发布时间】:2019-06-03 04:32:47
【问题描述】:

我有一个我的应用程序获取的 URL。它打印一个带有两个键的字典,但在其中一个键中有很多我想为我的应用程序获取的信息。

URL 获取大量信息,但不像传统的字典。

这是一个非常简化的版本:

["person": 
name: John
height: 187, "fruit": colour: red 
]

等等……

所以我只想得到关键人物中的人的名字,但我找不到这个。

有没有办法做到这一点?我一直在尝试 JSON 解析,for 循环,我被卡住了。

编辑:

它不是字典中的字典。如果你想看看我在做什么。只需复制并粘贴此链接即可。这是我正在使用的一个例子。 http://itunes.apple.com/lookup?bundleId=com.burbn.instagram

我只需要卖家名称或货币等。

读取链接并打印的代码:

    override func viewDidLoad() {
    super.viewDidLoad()
    fetchData { (dict, error) in
        print(dict!)
    }
}



func fetchData(completion: @escaping ([String:Any]?, Error?) -> Void) {
    let url = URL(string: link)!

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data else { return }
        do {
            if let array = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String:Any]{
                completion(array, nil)
            }
        } catch {
            print(error)
            completion(nil, error)
        }
    }
    task.resume()
}

【问题讨论】:

  • 信息太简单,太模糊,无法提出任何建议。
  • 这听起来绝对像是字典中的字典,所以如果不是这样,您需要更好地解释结构及其不同之处。如果您有相关代码,请将其包含在问题本身中,而不是作为链接。
  • 我包含了我正在使用的代码的链接。在该代码中,它显示了一个带有两个键的字典。其中一个关键是我想要提取的所有信息,但在某些部分。如果您查看该代码,您会看到

标签: json swift parsing dictionary


【解决方案1】:

您获取的数据是 JSON。为了使用它,您必须对其进行解码。推荐的方式是在 Swift 中使用JSONDecoder

首先你必须定义你的模型,它对应于数据模型,并使其符合Codable协议:

struct App: Codable {
    var sellerName: String
    // Alternatively, if you don't want to use an enum, you can use a String.
    var currency: Currency

    enum Currency: String, Codable {
        case australianDollar = "AUD",
        case britishPound = "GBP",
        case euro = "EUR",
        case hongKongDollar = "HKD",
        case usDollar = "USD"
        // Complete this with all the currency…
    }
}

struct JSONResult: Codable {
    var resultCount: Int
    var results: [App]
}

完成此操作后,您只需编辑您的 fetchData 方法,使其返回一个数组 App,其中填充了您获取的数据。

Swift 4 版本:

func fetchData(completion: @escaping (JSONResult?, Error?) -> Void) {
    guard let url = URL(string: link) else { return }

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            completion(nil, error)
            return
        } else if let data = data {
            do {
                let decoder = JSONDecoder()
                let result = try decoder.decode(JSONResult.self, from: data)
                completion(result, nil)
            } catch {
                print(error)
                completion(nil, error)
            }
        }
    }
    task.resume()
}

Swift 5 版本使用Result 类型:

func fetchData(completion: @escaping (Result<JSONResult, Error>) -> Void) {
    guard let url = URL(string: link) else { return }

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let error = error {
            completion(.failure(error))
            return
        } else if let data = data {
            do {
                let decoder = JSONDecoder()
                let result = try decoder.decode(JSONResult.self, from: data)
                completion(.success(result))
            } catch {
                print(error)
                completion(.failure(error))
            }
        }
    }
    task.resume()
}

More information about JSONDecoder

【讨论】:

  • 这不会编译。
  • @PeterDutton 我还编辑了我的答案以获得更准确的信息。
【解决方案2】:

字典数据是:

let dict = ["person": ["name": "John", "height": "187"], "fruit": ["colour": "red"]]

假设您需要此人的姓名。所以你可以通过以下方式来实现。

if let person = dict["person"], let name = person["name"] as? String {
    print (name)
}

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 2013-05-07
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多