私は以下のような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に表示しようとしています
これを達成する方法を理解するのを助けてください
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)
}
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"]
コメントに貼り付けることができませんでした。長すぎるか何かです
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"}
....
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
ここにあるのは、最初に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)")
}