struct Contact: Decodable, CustomStringConvertible { var id: String @NestedKey var firstname: String @NestedKey var lastname: String @NestedKey var address: String enum CodingKeys: String, NestableCodingKey { case id case firstname = "nested/data/user/firstname" case lastname = "nested/data/user/lastname" case address = "nested/data/address" } var description: String { "Contact(firstname: \(firstname), lastname: \(lastname), address: \(address))" } } let json = """ [ { "id": "1", "nested": { "data": { "user": { "firstname": "Alice", "lastname": "Wonderland" }, "address": "Through the looking glass" } } }, { "id": "2", "nested": { "data": { "user": { "firstname": "Bob", "lastname": "Builder" }, "address": "1, NewRoad" } } } ] """.data(using: .utf8)! let decoder = JSONDecoder() let list = try decoder.decode([Contact].self, from: json) // [Contact(firstname: Alice, lastname: Wonderland, address: Through the looking glass), Contact(firstname: Bob, lastname: Builder, address: 1, NewRoad)]