【问题标题】:Turning JSON file into an array in Swift/Xcode在 Swift/Xcode 中将 JSON 文件转换为数组
【发布时间】:2017-08-16 21:58:26
【问题描述】:

我整个星期都在挣扎。我是编程新手。我无法将简单的 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。

提前感谢您的耐心等待。

【问题讨论】:

  • 您发布的代码能走多远?请更新您的问题。你的标题说你想要一个数组。你问题的结尾说你想要一本字典。您的代码表明您的 JSON 文件是一个字典数组。
  • 抱歉,我指的是字典。它确实完全打印。但是我可以完全注释掉第二个守卫中的所有代码。所以我猜它没有阅读那部分代码。感谢您的快速回复

标签: json swift swift4


【解决方案1】:

我的猜测是您的 json 实际上是字典而不是数组。所以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(" ")
    }

试试吧,让我知道它是否有效。顺便说一句,这只是 do 块。

【讨论】:

  • 再次感谢您的回复,代码当然更进一步,但是,现在保护语句下的两个打印行出现以下错误.. 无法使用参数列表调用“打印” type '(String, () -> ()) 具体指向返回命令的开头。
  • 好的@erdos,我放了几个;将 return 语句与 guard let 中的 print 语句分开。这现在作为“不是字典数组”打印到屏幕上。感谢您迄今为止的帮助,我将继续插上电源,看看是否可以正常工作。
  • 您是否认为它会对无法将数据传输到字典中的数据产生影响,因为当解析来自 JSON 的数据时,输出会替换 : 与 =(冒号与等号)。这是打印到控制台时的 JSON 数据......'["menu": { drinks = ( { coke = 20; }, { pepsi = 20; }, { water = 20; } ); }]
  • 什么时候应该是["menu": { drinks : ( { coke = 20; }, { pepsi : 20; }, { water : 20; } ); }]
  • 调试器中的打印不应影响代码在您的应用中的工作方式。我意识到我没有在单独的行上有returns。现在可以用了吗?
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
相关资源
最近更新 更多