/ / jsonオブジェクトを持つ配列をソートする必要があります - json、swift

jsonオブジェクトを持つ配列をソートする必要があります - json、swift

jsonデータはdataTaskネットワーク呼び出しから返され、ここで配列に割り当てられます。

   let json = try? JSONSerialization.jsonObject(with: data!, options: [])
if let jsonarray = json as? [Any] {
self.cardArray = jsonarray
}

jsonは次のようになります。

[
{
"deviceID":114,
"UserName":"freds@hotmail.com",
"Name":"under sink",
"UniqueId":"D0:B5:C2:F2:B8:88",
"RowCreatedDateTime":"2018-01-02T16:07:31.607"
}
]

RowCreatedDateTimeというjsonプロパティに基づいてこの配列をソート(降順)するにはどうすればよいですか?

私はこれを試みたが、うまくいかなかった:

cardArray.sort{
$0.RowCreatedDateTime < $1.RowCreatedDateTime
}

回答:

回答№1は2

すべての辞書にキーが含まれていると仮定します RowCreatedDateTime キーで値を取得する必要があります。辞書にドット表記法を使用することはできません。

cardArray.sort{
($0["RowCreatedDateTime"] as! String) < $1["RowCreatedDateTime"] as! String
}

そして、配列の型が [[String:Any]] はるかに不特定にキャストしないでください [Any].


宣言 cardArray 辞書の配列として

var cardArray = [[String:Any]]()

このようにJSONを解析します

do {
if let jsonArray = try JSONSerialization.jsonObject(with: data!) as? [[String:Any]] {
self.cardArray = jsonArray
}
} catch { print(error) }

使用を検討する Codable Swift 4でJSONを解析して構造体に変換します。それは事をもっと簡単にします。


回答№2の場合は0

メイク cardArray [[String:Any]] の代わりに [Any].

var cardArray = [[String:Any]]()

その後、

let json = try? JSONSerialization.jsonObject(with: data!, options: [])
if let jsonarray = json as? [[String:Any]] {
self.cardArray = jsonarray
} else {
self.cardArray = []
}

最後に

self.cardArray.sort {
guard let left = $0["RowCreatedDateTime"] as? String else { return true }
guard let right = $1["RowCreatedDateTime"] as? String else { return false }

return left < right
}