超级新手在这里。
我有一个名为[
{
"id": "1",
"name": "hello",
"description": "aaa"
},
{
"id": "2",
"name": "world",
"description": "bbb"
}
]
的示例json,它嵌入在我的项目中
let itemsListJson:String = "jsons/items_tmp"
guard let urlItems = Bundle.main.url(forResource: itemsListJson, withExtension: "json") else { return }
do{
let dataItems = try Data(contentsOf: urlItems)
let jsonItems = try JSONSerialization.jsonObject(with: dataItems, options: .mutableContainers)
guard let arrayItems = jsonItems as? [Any] else {return}
print(arrayItems.count)
for i in 0 ..< arrayItems.count {
let max_damage = arrayItems[i]
print(max_damage)
}
}
catch{
print(error)
}
我正在尝试读取文件,将其设置为字典对象,以便我可以通过数据进行迭代并按键名调用元素。
到目前为止,我在viewDidLoad中有这个:
2
{
description = aaa;
id = 1;
name = hello;
}
{
description = bbb;
id = 2;
name = world;
}
得到以下输出:
let name = arrayItems[i].name
所以我得到了我的信息,但它也不是关键 - &gt;价值形成
当我尝试按键获取特定值时
guard let arrayItems = jsonItems as? [String: Any] else {return}
我得到:输入任何没有会员名称的
另一方面,如果我将以下行更改为字典结构,则:
dict
我没有数据。
不确定它是如何完成的。
非常感谢任何帮助
答案 0 :(得分:2)
只需创建符合Codable的Item结构并将Item数组类型传递给json解码器:
struct Item: Codable {
let id: String
let name: String
let info: String
private enum CodingKeys: String, CodingKey {
case id, name, info = "description"
}
}
游乐场测试:
let dataItems = Data("""
[
{
"id": "1",
"name": "hello",
"description": "aaa"
},
{
"id": "2",
"name": "world",
"description": "bbb"
}
]
""".utf8)
do {
let items = try JSONDecoder().decode([Item].self, from: dataItems)
for item in items {
print("id:", item.id)
print("name:", item.name)
print("description:", item.info)
}
} catch {
print(error)
}
id:1
name:hello
描述:aaa
id:2
name:world
描述:bbb
答案 1 :(得分:0)
您将获得&#34;输入任何没有会员名称的#34;因为你没有定义它。我闻到以下可能的副本,因为你的json是一个数组,而不是字典...
Convert JSON String to Swift Dictionary
答案 2 :(得分:0)
感谢所有答案,这就是我所寻找的:
let itemsListJson:String = "jsons/items_tmp"
guard let urlItems = Bundle.main.url(forResource: itemsListJson, withExtension: "json") else { return }
do{
let dataItems = try Data(contentsOf: urlItems)
let jsonItems = try JSONSerialization.jsonObject(with: dataItems, options: .mutableContainers)
guard let arrayItems = jsonItems as? [Any] else {return}
for i in 0 ..< arrayItems.count {
let tmp = arrayItems[i] as! [String: Any]
print(tmp["id"]!)
print(tmp["name"]!)
print(tmp["description"]!)
}
}
catch{
print(error)
}
这有助于我理解我做错了什么。 您的JSON是一个字典数组。相应地施展。 - rmaddy 所以基本上我把json作为数组,遍历数组,然后将每个数组元素视为字典,这样我就可以使用key-&gt; value属性