Как разобрать массив JSON в массив в Swift

Я пытаюсь разобрать JSON, как показано ниже

[
  {
    "People": [
      "Jack",
      "Jones",
      "Rock",
      "Taylor",
      "Rob"
    ]
  },
  {
    "People": [
      "Rose",
      "John"

    ]
  },
  {
    "People": [
      "Ted"
    ]
  }
]

в массив, который приводит к:

[ ["Jack", "Jones", "Rock", "Taylor", "Rob"] , ["Rose", "John"], ["Ted"] ]

который представляет собой массив массивов.

Я пробовал с кодом ниже

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)
    }
}

когда я печатаю людей, я получаю o / p как

{
  People = (
    "Jack",
    "Jones",
    "Rock",
    "Taylor",
    "Rob"
  );
}
{
  People = (
    "Rose",
    "John"
  );
}
...

Я не понимаю, как разбирать, когда люди повторяются 3 раза

Попытка отобразить контент в UITableView, где в моей 1-й ячейке есть Джек .. Роб, а во второй ячейке есть Роза, Джон, а в третьей ячейке - Тед.

Пожалуйста, помогите мне понять, как этого добиться


person Ashh    schedule 07.02.2017    source источник


Ответы (5)


 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)

вывод:

[["Jack", "Jones", "Rock", "Taylor", "Rob"], ["Rose", "John"], ["Ted"]]

В вашем случае это будет:

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)
}
person Bista    schedule 07.02.2017

Вы можете сделать это элегантным и безопасным способом, используя Swift 4 Decodable

Сначала определите тип для вашего массива людей.

struct People {
  let names: [String]
}

Затем сделайте его 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)
  }
}

Теперь вы можете легко декодировать вводимые данные в формате 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
}

Наконец, чтобы получить линейный массив имен, вы можете сделать

let names = people.flatMap { $0.names }
// => ["Jack", "Jones", "Rock", "Taylor", "Rob", "Rose", "John", "Ted"]
person mokagio    schedule 30.01.2018

предположим, что json - это закодированные данные

var arrayOfData : [String] = []
dispatch_async(dispatch_get_main_queue(),{
    for data in json as! [Dictionary<String,AnyObject>]
    {
        let data1 = data["People"]

        arrayOfData.append(data1!)
    }
})

Теперь вы можете использовать arrayOfData. : D

person Gabriel M.    schedule 10.02.2017

Я не смог вставить его в комментарий, он слишком длинный или что-то в этом роде

static func photosFromJSONObject(data: Data) -> photosResult {
    do {
        let jsonObject: Any =
                try JSONSerialization.jsonObject(with: data, options: [])

        print(jsonObject)

        guard let
              jsonDictionary = jsonObject as? [NSObject: Any] as NSDictionary?,
              let trackObject = jsonDictionary["track"] as? [String: Any],
              let album = trackObject["album"] as? [String: Any],
              let photosArray = album["image"] as? [[String: Any]]
                else {
            return .failure(lastFMError.invalidJSONData)
        }
    }
}

И json выглядел примерно так:

{
  artist: {
    name: Cher,
    track: {
        title: WhateverTitle,
        album: {
          title: AlbumWhatever,
          image: {
             small: "image.px",
             medium: "image.2px",
             large: "image.3px"}
       ....
person anckydocky    schedule 07.02.2017

То, что у вас есть, - это сначала массив из 3 объектов. каждый объект - это словарь, в котором ключом являются люди, а значением - массив строк. когда вы пытаетесь выполнить сериализацию json, вы должны привести ее к ожидаемому результату. Итак, сначала у вас есть массив объектов, затем у вас есть словарь с String: Any, затем вы получаете массив String

let peoplesArray = try! JSONSerialization.jsonObject(with: Data(contentsOf: URL(fileURLWithPath: path)), options: []) as? [AnyObject]
guard let peoplesObject = peoplesArray["people"] as? [[String:Any]] else { return }
for people in peoplesObject {
    print("\(people)")
}
person anckydocky    schedule 07.02.2017
comment
я получаю ноль в peopleObject, когда я выполняю ... мой JSON прав, но не уверен, почему - person Ashh; 07.02.2017
comment
у вас есть свой json внутри вашего приложения или вы получаете его как ответ из Интернета? вы, вероятно, получаете ноль из-за! от попытки, но я не уверен - person anckydocky; 07.02.2017
comment
послушайте, это пример того, как мне удалось разобрать ответ JSON от LastFM - person anckydocky; 07.02.2017