如何在Swift中解析数组JSON到数组

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)