If you use Decodable structs, you must define 2 data structures:
struct First: Decodable {
let key1: String
let key2: String
}
struct Second: Decodable {
let rootKey: First
}
Then you can perform two different data requests, obtain different json Data objects. For the first case you try to decode First object:
func request1(completion: (Result<First, Error>) -> Void) {
// make async request for data
let data = Data()
// decode result and call your completion handler in request completion
do {
let model = try JSONDecoder().decode(First.self, from: data)
completion(.success(model))
} catch {
completion(.failure(error))
}
}
For the second one, you try to decode the Second object, but take only the First object from rootKey:
func request2(completion: (Result<First, Error>) -> Void) {
// make async request for data
let data = Data()
// decode result and call your completion handler in request completion
do {
let model = try JSONDecoder().decode(Second.self, from: data)
// take the First object from decoded result
completion(.success(model.rootKey))
} catch {
completion(.failure(error))
}
}