Если ваше намерение не раскрывать свойства, которые мне не нужны , то один из способов - это частное декодирование всей структуры, а затем сделать доступными только те свойства, которые вы собираетесьразоблачить во внешнем мире.
struct Health {
let size: Size
let title: String
struct Size: Decodable {
let width: Int
let height: Int
}
private struct RawResponse: Decodable {
let health: PrivateHealth
struct PrivateHealth: Decodable {
let size: Size
let name: String
}
}
}
// Decodable requirement is moved to extension so that default initializer is accessible
extension Health: Decodable {
init(from decoder: Decoder) throws {
let response = try RawResponse(from: decoder)
size = response.health.size
title = response.health.name
}
}
Использование:
let jsonData = """
{
"health": {
"size":{
"width":150,
"height":150
},
"name":"Apple"
}
}
""".data(using: .utf8)!
do {
let health = try JSONDecoder().decode(Health.self, from: jsonData)
print(health.size) // Size(width: 150, height: 150)
print(health.title) // Apple
} catch {
print(error.localizedDescription)
}
Редактировать: если вам нужна также функция кодирования
Если вам также необходимо реализовать протокол Encodable
, чтобы вы могли кодировать свои данные, как фактический ответ, то вы можете сделать это с помощью:
extension Health: Encodable {
func encode(to encoder: Encoder) throws {
let health = Health.RawResponse.PrivateHealth(size: size, name: title)
let response = RawResponse(health: health)
var container = encoder.singleValueContainer()
try container.encode(response)
}
}
Чтобы это работало, вам понадобитсячтобы ваша структура RawResponse
, PrivateHealth
и Size
была также кодируемой
- Изменить на
private struct RawResponse: Encodable, Decodable {
- Изменить на
struct PrivateHealth: Encodable, Decodable {
- Изменить на
struct Size: Encodable, Decodable {
Пример кодирования:
let health = Health(size: Health.Size(width: 150, height: 150), title: "Apple")
do {
let encodedHealth = try JSONEncoder().encode(health) // Encoded data
// For checking purpose, you convert the data to string and print
let jsonString = String(data: encodedHealth, encoding: .utf8)!
print(jsonString) // This will ensure data is encoded as your desired format
} catch {
print(error.localizedDescription)
}