【问题标题】:Problem with json serialization and fetch valuesjson序列化和获取值的问题
【发布时间】:2019-01-17 03:51:47
【问题描述】:

我有 JSON 格式的数据,我想从如下结构中获取数据 - 我想获取时间值,在本例中为 String: "04:35:00" 并将所有这些时间值附加到我的 Hours 模型中。

{
"result": [
    {
        "values": [
            {
                "value":"null",
                "key":"symbol_2"

            },
            {
                "value":"null",
                "key":"symbol_1"},
            {
                "value":"016",
                "key":"company"

            },
            {
                "value":"QUW12DO",
                "key":"direction"

            },
            {
                "value":"TD-4WYS",
                "key":"road"

            },
            {
                "value":"04:35:00",
                "key":"time"

}]},

//通过这样的代码:

URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in



        if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {

            print(jsonObj!.value(forKey: "result")!)

            if let stopsArray = jsonObj!.value(forKey: "result") as? NSArray {

                    for stop in stopsArray{


                        if let stopDict = stop as? NSDictionary {


                            let hours = stopDict.value(forKey: "time")

                            let myModel = Hours(hours: hours as? String)
                            self.list.append(myModel)
                            print("LIST: \(self.list)")

                            DispatchQueue.main.async {
                                self.actInd.stopAnimating()
                                self.actInd.isHidden = true
                                self.containerLittle.isHidden = true
                                self.loadingView.isHidden = true
                            }
                        }
                    }

            }
        }
    }).resume()

在我将代码附加到模型的这一刻,我到处都是零。如何获取模型的时间值?

【问题讨论】:

  • 首先 - 不要在 Swift 中使用 NSDictionaryNSArray。使用正确的 Swift 字典和数组。先解决这个问题,事情会容易得多。
  • 您的回复中没有"time" 键。

标签: json swift serialization


【解决方案1】:

你有更复杂的 JSON 结构。您的 JSON 是包含字典数组的字典数组。试试这个代码:


    typealias JSONDict = Dictionary<String, Any>
    typealias JSONArray = Array<Any>

    if let result = jsonObj?["result"] as? JSONArray {
        for case let value as JSONDict in result {
            if let values = value["values"] as? JSONArray {
                for case let value as [String : String] in values {
                    if let timeString = value["value"], value["key"] == "time" {
                        // Create your Hours model
                        print(timeString)

                        // Use break only if you have single "time" member in "values" array
                        //break
                    }
                }

                // Use break only if you have single "values" member in "result" array
                //break
            }
        }
    }

【讨论】:

  • 是的,伙计们,你们成就了我的一天!我只删除 break 并且 myModel 包含我需要的所有内容。谢谢!
  • @Moritz 你对 value(forKey:) 方法是正确的。这只是我这边的一个错字。我已经用 object(forKey:) 方法替换了它,谢谢。您还看到什么错误?此代码在 Playground 中运行良好并提供正确的结果。
  • @Moritz 我做了一些重构,现在看起来更像 Swift 方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-11
  • 2022-01-17
相关资源
最近更新 更多