在 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; ); ]
调试器中的打印不应影响代码在您的应用中的工作方式。我意识到我没有在单独的行上有return
s。现在可以用了吗?以上是关于在 Swift/Xcode 中将 JSON 文件转换为数组的主要内容,如果未能解决你的问题,请参考以下文章
如何在情节提要 XCode6 (Swift) 中将所有视图控制器设置为风景
如何在 swift Xcode 中将 TextView 添加到 VStack 的顶部?
如何使用 Swift 2 + XCode 7 + iOS 9 获取和解析 JSON [重复]