2017-12-08 17 views
1

私はNASAのNear Earth Object Web Serviceと協力して、アプリケーションに表示するデータを取得しています。 Swift 4のCodableプロトコルの使い方を理解していますが、応答の一部をどのようにマッピングするのか分かりません。 Pawを使用して未知の辞書キーを使用したSwift 4コーディング可能なプロトコルの使用

、私はAPIからの応答を検査:

Image of API response data

あなたが見ることができるように、near_earth_objects構造はDictionaryで、キーは日付です。問題は、URLパラメータが日付であるため、これらの日付構造がリクエストの日に応じて変更されることです。したがって、Codableプロトコルを使用しているときに、自動的にマップされるプロパティをどのように作成できるか分かりません。

私はこれらの構造体の内部に取得しようとしていたデータがDictionary Sが含まれているArray秒されている:どのように私は私のモデルオブジェクトがCodableプロトコルに準拠し、これらの構造をマップ

Image of API response data

を持つことができますリクエストの日付が変わると日付が変わるのですか?

+1

あなたはこれが役立つことがあります。https://stackoverflow.com/questions/47603630/dynamic-json-decoding-swift-4/47604459?noredirect=1#comment82179797_47604459は –

+0

あなたは、JSONのサンプルを投稿することができますか? –

答えて

1

あなたは復号後Dictionaryを維持する気にならないのであればDictionaryコンパイル時のキーを知っている必要はありません。

タイプDictionary<String:YourCustomDecodableType>のプロパティを指定するだけで済みます。キーは観測に対応する日付になり、値はカスタムタイプのすべてのオブジェクトの配列になります。

struct NearEarthObject: Codable { 
    let referenceID:String 
    let name:String 
    let imageURL:URL 

    private enum CodingKeys: String, CodingKey { 
     case referenceID = "neo_reference_id" 
     case name 
     case imageURL = "nasa_jpl_url" 
    } 
} 

struct NEOApiResponse: Codable { 
    let nearEarthObjects: [String:[NearEarthObject]] 

    private enum CodingKeys: String,CodingKey { 
     case nearEarthObjects = "near_earth_objects" 
    } 
} 

do { 
    let decodedResponse = try JSONDecoder().decode(NEOApiResponse.self, from: data) 
} catch { 
    print(error) 
} 
0

あなたが言ったように、near_earth_objectsは辞書ですが、キーは日付ではなく、キーは文字列であり、値は既知の構造の配列です。したがって、上記のコードは動作します:

... 
let nearEarthObjects: [String: [IndexObject]] 
... 

enum CodingKey: String, CodingKeys { 
    case nearEarthObjects = "near_earth_objects" 
} 

struct IndexObject: Decodable { 
    ... 
    let name: String 
    ... 
} 
関連する問題