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
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)
}
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"]
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"}
....
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É
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)")
}