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

Posted

技术标签:

【中文标题】在 Swift/Xcode 中将 JSON 文件转换为数组【英文标题】:Turning JSON file into an array in Swift/Xcode 【发布时间】: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 文件是一个字典数组。 抱歉,我指的是字典。它确实完全打印。但是我可以完全注释掉第二个守卫中的所有代码。所以我猜它没有阅读那部分代码。感谢您的快速回复 【参考方案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。现在可以用了吗?

以上是关于在 Swift/Xcode 中将 JSON 文件转换为数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在情节提要 XCode6 (Swift) 中将所有视图控制器设置为风景

如何在 swift Xcode 中将 TextView 添加到 VStack 的顶部?

在 Swift xCode 中将 UI 导航栏设置为半透明

如何使用 Swift 2 + XCode 7 + iOS 9 获取和解析 JSON [重复]

调用//JSON 文件在 SWIFT 中损坏?缺少参数“委托”的参数?

Swift3、XCode8、iOS10 的 Swifty JSON 性能下降