Last active
May 17, 2018 16:16
-
-
Save aunnnn/2d6bb20b9dfab41189a2411247d04904 to your computer and use it in GitHub Desktop.
Decodable from specific key of json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"applmusic":{ | |
"code":"AAPL", | |
"quality":"good", | |
"line":"She told me don't worry", | |
}, | |
"spotify":{ | |
"differentcode":"SPOT", | |
"music_quality":"good", | |
"spotify_specific_code":"absent in apple" | |
}, | |
"amazon":{ | |
"amzncode":"SPOT", | |
"music_quality":"good", | |
"stanley":"absent in apple" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
struct Applmusic: Decodable { | |
let code: String | |
let quality: String | |
let line: String | |
} | |
struct Spotify: Decodable { | |
let differentcode: String | |
let music_quality: String | |
let spotify_specific_code: String | |
} | |
struct Amazon: Decodable { | |
let amzncode: String | |
let music_quality: String | |
let stanley: String | |
} | |
struct DecodingHelper { | |
private struct Key: CodingKey { | |
let stringValue: String | |
init?(stringValue: String) { | |
self.stringValue = stringValue | |
self.intValue = nil | |
} | |
let intValue: Int? | |
init?(intValue: Int) { | |
return nil | |
} | |
} | |
private struct ModelResponse<NestedModel: Decodable>: Decodable { | |
let nested: NestedModel | |
public init(from decoder: Decoder) throws { | |
let key = Key(stringValue: decoder.userInfo[CodingUserInfoKey(rawValue: "my_model_key")!]! as! String)! | |
let values = try decoder.container(keyedBy: Key.self) | |
nested = try values.decode(NestedModel.self, forKey: key) | |
} | |
} | |
static func decode<T: Decodable>(modelType: T.Type, fromKey key: String) throws -> T { | |
// mock data, replace with network response | |
let path = Bundle.main.path(forResource: "test", ofType: "json")! | |
let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) | |
let decoder = JSONDecoder() | |
decoder.userInfo[CodingUserInfoKey(rawValue: "my_model_key")!] = key | |
let model = try decoder.decode(ModelResponse<T>.self, from: data).nested | |
return model | |
} | |
} | |
do { | |
let appl = try DecodingHelper.decode(modelType: Applmusic.self, fromKey: "applmusic") | |
let amazon = try DecodingHelper.decode(modelType: Amazon.self, fromKey: "amazon") | |
let spotify = try DecodingHelper.decode(modelType: Spotify.self, fromKey: "spotify") | |
print(appl, amazon, spotify) | |
} catch let error { | |
print(error.localizedDescription) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment