jsonの解析に問題があります。私はこれを解決する方法をしばらく探してきましたが、成功はありませんでした。Swift 3 Alamofire Swifty json parsing issue
私のJSON出力は次のようになります。
{
"data": [{
"type": "schedules",
"id": "1",
"attributes": {
"date": "2016-12-24"
},
"relationships": {
"user": {
"data": {
"type": "users",
"id": "8"
}
},
"statuses": {
"data": [{
"type": "statuses",
"id": "2"
}]
},
"events": {
"data": [{
"type": "events",
"id": "7"
}]
}
}
}, {
"type": "schedules",
"id": "2",
"attributes": {
"date": "2016-12-04"
},
"relationships": {
"user": {
"data": {
"type": "users",
"id": "8"
}
},
"statuses": {
"data": [{
"type": "statuses",
"id": "12"
}, {
"type": "statuses",
"id": "16"
}, {
"type": "statuses",
"id": "17"
}]
},
"events": {
"data": [{
"type": "events",
"id": "16"
}, {
"type": "events",
"id": "17"
}, {
"type": "events",
"id": "1"
}]
}
}
}, {
"type": "schedules",
"id": "3",
"attributes": {
"date": "2002-12-03"
},
"relationships": {
"user": {
"data": {
"type": "users",
"id": "7"
}
},
"statuses": {
"data": [{
"type": "statuses",
"id": "3"
}, {
"type": "statuses",
"id": "11"
}]
},
"events": {
"data": [{
"type": "events",
"id": "4"
}, {
"type": "events",
"id": "19"
}]
}
}
}],
"included": [
{
"type": "events",
"id": "6",
"attributes": {
"name": "streamline leading-edge portals",
"event_type": "3",
"start_time": "22:20:04",
"end_time": "20:19:22"
}
}, {
"type": "events",
"id": "11",
"attributes": {
"name": "maximize dynamic niches",
"event_type": "8",
"start_time": "15:51:06",
"end_time": "22:24:56"
}
}, {
"type": "events",
"id": "12",
"attributes": {
"name": "transition vertical methodologies",
"event_type": "1",
"start_time": "19:55:59",
"end_time": "00:27:42"
}
}
]
}
これを取得するために私のスウィフトは次のようになります。
func getSchedules<T: JSONObject>(_ success: @escaping ([T]) -> Void) {
self.getAllScheduleData { (json) in
var items: [T] = []
if let jsonArray = json.array {
for jsonItem in jsonArray {
items.append(T.fromJSONComplete(json: jsonItem) as! T)
}
}
success(items)
}
}
self.getAllScheduleDataは
ここで問題Alamofire
を使用してAPI呼び出しを行いますis、json.arrayは常に空です。私が理解しているように、それはいつもjson ["items"]配列のようなものでなければなりません。ただし、このjsonには電話する最上位レイヤはありません。アイテム。
私のオプションは、json ["data"]またはjson ["included"]を取得するオプションです。しかし、私はそれらをオブジェクトの両方に解析する必要があります。
残念なことにこれを説明する方法がわかりません 詳細が必要な場合は、尋ねてください。
私が使用しています:スウィフト3、Alamofire、SwiftyJSON
編集:私も呼び出しからJSONを取得した後、それにトップ層を追加することを検討している 。 すなわちアイテム を{データは、{}、{}含ま}しかしEmptylessにより示唆されるように、私は構文にするために使用している場合は、右
それを行うことが出来なかった私はおそらく正しい、このメソッドのシグネチャを変更することがありますか?
static func fromJSONComplete<T : Object>(json: JSON) -> T {
let s = Schedule()
if let id = json["data"]["id"].string {
s.id = id
}
if let date = json["data"]["attributes"]["date"].string {
s.date = date
}
if let type = json["data"]["type"].string {
s.type = type
}
if let includedArray = json["included"].array {
for userJson in includedArray {
if userJson["type"].string == "users" {
let user : User = User.fromJSON(json: userJson)
s.users.append(user)
}
}
for statusJson in includedArray {
if statusJson["type"].string == "statuses" {
let status : Status = Status.fromJSON(json: statusJson)
s.statuses.append(status)
}
}
for eventJson in includedArray {
if eventJson["type"].string == "events" {
let event : Event = Event.fromJSON(json: eventJson)
s.events.append(event)
}
}
}
return s as! T
}
ありがとうございます!
クリス
構文でforを試してみましたか? for(key、subJSON)for json {}。次に、json [key]を使って "data"と "included"の両方のキーを反復処理できます。 – Emptyless
@Emptyless私はそれを試しましたが、私はそれがどのように使われているかを完全に理解していないと思います。コード例を教えてください。 – Chrizlee