将JSON文件转换为Swift / Xcode中的数组

时间:2017-08-16 21:58:27

标签: json swift swift4

我整个星期都在苦苦挣扎。我是编程新手。我无法将简单的JSON文件转换为Xcode中的字典。使用Codable的新方法在线提供的简化文档很少。所以我使用的是演练,其中包含以下代码。

导入UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let path = Bundle.main.path(forResource: "menu", ofType: "json") else { return }
        let url = URL(fileURLWithPath: path)

        do {

            let data = try Data(contentsOf: url)
            let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
            //print(json)

            guard let array = json as? [Any] else { return }
            for user in array {
                guard let userDict = user as? [String: Any] else { return }
                guard let drinks = userDict["drinks"] as? String else { print("not a String"); return }
                guard let junkFood = userDict["junk-food"] as? String else { return }

                print(drinks)
                print(junkFood)
                print(" ")
            }
        }
        catch {
            print(error)
        }

    }

}

The below code is what my JSON looks like.

{"menu": {
  "drinks": [
    {"coke": "20"},
    {"pepsi": "20"},
    {"water": "20"}
  ],
  "junk-food": [
    {"hamburger": "40"},
    {"fries": "20"},
    {"pizza": "20"}
  ]
}}

任何人都可以引导我,或者向我展示一些关于如何将JSON转换为字典的简化文档,以后我可以将数据映射到其中吗?我正在使用Xcode并尝试使用Swift 4。

提前感谢您的耐心等待。

1 个答案:

答案 0 :(得分:1)

我的猜测是你的json实际上是一个Dictionary而不是一个Array。所以guard let array = json as? [Any] else { return }正在落空,因为json是[String: Any]。您可以使用"menu"键访问该数组。

以下是您的代码的更新版本:

 do {
        let data = try Data(contentsOf: url)
        let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers)
        //print(json)

        guard let menuDict = json as? [String: Any] else { return }

        guard let drinks = menuDict["drinks"] as? [[String: Any]] else { 
            print("not an array of dictionaries") 
            return 
        }

        guard let junkFood = menuDict["junk-food"] as? [[String: Any]] else { 
            print("not an array of dictionaries") 
            return 
        }
            print(drinks)
            print(junkFood)
            print(" ")
    }

试试看,让我知道它是否有效。顺便说一下,这只是一个障碍。