webentwicklung-frage-antwort-db.com.de

So analysieren Sie ein Array von JSON in Swift in einem Array

Ich versuche, JSON zu analysieren, was wie folgt aussieht

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

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

zu einem Array, das zu [["Jack", "Jones", "Rock", "Taylor", "Rob"], ["Rose", "John"], ["Ted"]] führt

das ist Array von Arrays.

Ich habe es mit dem folgenden Code versucht 

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

        }

wenn ich "leute" drucke, bekomme ich o/p als 

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

Ich bin verwirrt, wie man analysiert, wenn "People" 3-mal wiederholt wird

Versuch, Inhalte in UITableView anzuzeigen, wobei in meiner ersten Zelle "Jack" .. "Rob" und in der zweiten Zelle "Rose", "John" und in der dritten Zelle "Ted" angezeigt wird.

Bitte helfen Sie mir zu verstehen, wie ich das erreichen kann

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)

ausgabe:

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

In Ihrem Fall wird es sein:

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

Sie können dies auf elegante und sichere Art und Weise tun, indem Sie Swift 4 Decodable nutzen.

Definieren Sie zunächst einen Typ für Ihr Personenarray.

struct People {
  let names: [String]
}

Dann machen Sie es Decodable, damit es mit einem JSON initialisiert werden kann.

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

Jetzt können Sie Ihre JSON-Eingabe problemlos decodieren

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
}

Um endlich ein lineares Array von Namen zu erhalten, können Sie dies tun

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

Ich konnte es nicht in einen Kommentar einfügen, es ist zu lang oder so 

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

Und der Json war so etwas wie:

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

nehmen wir an, dass der Json die verschlüsselten Daten ist

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

    arrayOfData.append(data1!)
    }
    })

Sie können jetzt arrayOfData verwenden. : D

0
Gabriel M.

was Sie hier haben, ist zunächst ein Array von 3 Objekten. Jedes Objekt ist ein Wörterbuch, in dem der Schlüssel "people" und der Wert ein Array von Strings ist. Wenn Sie versuchen, die Jsonserialisierung durchzuführen, müssen Sie sie auf das erwartete Ergebnis reduzieren. Sie haben also zunächst ein Array von Objekten, dann ein Wörterbuch mit String: Any und dann ein Array von 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