web-dev-qa-db-fra.com

Comment analyser un tableau de JSON dans un tableau dans Swift

J'essaie d'analyser JSON, comme ci-dessous

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

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

à un tableau qui donne [["Jack", "Jones", "Rock", "Taylor", "Rob"], ["Rose", "John"], ["Ted"]]

qui est un tableau de tableaux.

J'ai essayé avec le code ci-dessous 

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

        }

quand j’imprime "les gens" j’obtiens comme 

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

Je suis confus comment analyser quand il a "People" répété 3 fois

Essayer d'afficher du contenu dans UITableView où ma première cellule a "Jack" .. "Rob" et la deuxième cellule a "Rose", "John" et la troisième cellule en tant que "Ted"

Aidez-moi à comprendre comment y parvenir

8
Ashh
 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)

sortie:

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

Dans votre cas, ce sera:

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

Vous pouvez le faire de manière élégante et sûre en utilisant Swift 4 Decodable

Commencez par définir un type pour votre tableau de personnes.

struct People {
  let names: [String]
}

Ensuite, faites-le Decodable, de sorte qu'il puisse être initialisé avec un 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)
  }
}

Maintenant, vous pouvez facilement décoder votre entrée 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
}

Enfin, pour obtenir votre tableau linéaire de noms que vous pouvez faire

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

Je ne pouvais pas le coller dans un commentaire, c'est trop long ou quelque chose comme ça 

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

Et le JSON était quelque chose comme:

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

supposons que le json est la donnée encodée

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

    arrayOfData.append(data1!)
    }
    })

Vous pouvez maintenant utiliser arrayOfData. :RÉ

0
Gabriel M.

ce que vous avez ici est d’abord un tableau de 3 objets. chaque objet est un dictionnaire dont la clé est people et la valeur est un tableau de chaînes. quand vous essayez de faire de la sérialisation, vous devez vous en tenir au résultat attendu. Donc vous avez d’abord un tableau d’objets, puis un dictionnaire avec String: Any, puis vous obtenez un tableau de 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)") 
 }
0
anckydocky