2017-01-22 20 views
0

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 
    } 

ありがとうございます!

クリス

+0

構文でforを試してみましたか? for(key、subJSON)for json {}。次に、json [key]を使って "data"と "included"の両方のキーを反復処理できます。 – Emptyless

+0

@Emptyless私はそれを試しましたが、私はそれがどのように使われているかを完全に理解していないと思います。コード例を教えてください。 – Chrizlee

答えて

0

要求どおりのコード例は:

for (key,subjson) in json { 
    for i in 1 ..< json[key].count where subjson.array != nil { 
     print("found json for key: \(key): \(json[key][i])") 
    } 
} 

これはJSONオブジェクトに設けられ、反復使用可能な最上位のキー上をチェックします。キーにオブジェクトの配列が含まれている場合は、そのオブジェクトを反復処理します。

私が主に使用するアプローチは、キーをオンにしてjsonオブジェクトを初期化子として渡すことですが、関数で分割することもできます。

switch(key) { 
case "included": 
    // Do something 
case "data": 
    // Do Something 
default: 
    break 
} 
+0

ありがとう@Emptyless!それは働いた:D 私はあなたをupvotedしかしそれは私の低いrepの笑のためにまだ登録しない – Chrizlee