web-dev-qa-db-ja.com

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

「People」が3回繰り返された場合の解析方法がわかりません

1番目のセルに「Jack」..「Rob」があり、2番目のセルに「Rose」、「John」、3番目のセルが「Ted」であるコンテンツをUITableViewに表示しようとしています

これを達成する方法を理解するのを助けてください

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

出力:

[["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)
}
10
Bista

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"]
10
mokagio

コメントに貼り付けることができませんでした。長すぎるか何かです

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"}
       ....
1
anckydocky

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

0
Gabriel M.

ここにあるのは、最初に3つのオブジェクトの配列です。各オブジェクトは辞書であり、キーは人であり、値は文字列の配列です。 jsonserializationを実行しようとしているときは、予想される結果にキャストする必要があります。したがって、最初にオブジェクトの配列があり、次に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)") 
 }
0
anckydocky