Ash*_*shh 10 arrays json ios swift
我正在尝试解析JSON,如下所示
[
{
"People": [
"Jack",
"Jones",
"Rock",
"Taylor",
"Rob"
]
},
{
"People": [
"Rose",
"John"
]
},
{
"People": [
"Ted"
]
}
]
Run Code Online (Sandbox Code Playgroud)
一个数组导致[["杰克","琼斯","摇滚","泰勒","罗布"],["玫瑰","约翰"],["泰德"]]
这是数组的数组.
我试过下面的代码
if let path = Bundle.main.path(forResource: "People", ofType: "json")
{
let peoplesArray = try! JSONSerialization.jsonObject(with: Data(contentsOf: URL(fileURLWithPath: path)), options: JSONSerialization.ReadingOptions()) as? [AnyObject]
for people in peoplesArray! {
print(people)
}
}
Run Code Online (Sandbox Code Playgroud)
当我打印"人"时,我得到了o/p as
{
People = (
Jack,
"Jones",
"Rock",
"Taylor",
"Rob"
);
}
{
People = (
"Rose",
"John"
);
}
.....
Run Code Online (Sandbox Code Playgroud)
当"人物"重复3次时,我很困惑如何解析
试图在UITableView中显示内容,我的第一个单元格中有"Jack".."Rob",第二个单元格中有"Rose","John"和第三个单元格为"Ted"
PLease帮助我了解如何实现这一目标
Bis*_*sta 10
var peoplesArray:[Any] = [
[
"People": [
"Jack",
"Jones",
"Rock",
"Taylor",
"Rob"
]
],
[
"People": [
"Rose",
"John"
]
],
[
"People": [
"Ted"
]
]
]
var finalArray:[Any] = []
for peopleDict in peoplesArray {
if let dict = peopleDict as? [String: Any], let peopleArray = dict["People"] as? [String] {
finalArray.append(peopleArray)
}
}
print(finalArray)
Run Code Online (Sandbox Code Playgroud)
输出:
[["Jack", "Jones", "Rock", "Taylor", "Rob"], ["Rose", "John"], ["Ted"]]
Run Code Online (Sandbox Code Playgroud)
在您的情况下,它将是:
if let path = Bundle.main.path(forResource: "People", ofType: "json") {
let peoplesArray = try! JSONSerialization.jsonObject(with: Data(contentsOf: URL(fileURLWithPath: path)), options: JSONSerialization.ReadingOptions()) as? [Any]
var finalArray:[Any] = []
for peopleDict in peoplesArray {
if let dict = peopleDict as? [String: Any], let peopleArray = dict["People"] as? [String] {
finalArray.append(peopleArray)
}
}
print(finalArray)
}
Run Code Online (Sandbox Code Playgroud)
mok*_*gio 10
你可以利用Swift 4以优雅和类型安全的方式做到这一点 Decodable
首先为people数组定义一个类型.
struct People {
let names: [String]
}
Run Code Online (Sandbox Code Playgroud)
然后创建它Decodable,以便可以使用JSON初始化它.
extension People: Decodable {
private enum Key: String, CodingKey {
case names = "People"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: Key.self)
self.names = try container.decode([String].self, forKey: .names)
}
}
Run Code Online (Sandbox Code Playgroud)
现在您可以轻松解码您的JSON输入
guard
let url = Bundle.main.url(forResource: "People", withExtension: "json"),
let data = try? Data(contentsOf: url)
else { /* Insert error handling here */ }
do {
let people = try JSONDecoder().decode([People].self, from: data)
} catch {
// I find it handy to keep track of why the decoding has failed. E.g.:
print(error)
// Insert error handling here
}
Run Code Online (Sandbox Code Playgroud)
最后得到你可以做的线性数组
let names = people.flatMap { $0.names }
// => ["Jack", "Jones", "Rock", "Taylor", "Rob", "Rose", "John", "Ted"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
37074 次 |
| 最近记录: |