Я пытаюсь извлечь "data"
из JSON ниже:
{
"result": "success",
"code": 200,
"version": "1",
"time": 1,
"id": "NODATA",
"data": {
"user_address_town": {
"label": "town",
"required": true,
"type": "string",
"value": ""
},
"user_address_county": {
"label": "county",
"required": true,
"type": "string"
},
"user_address_line_1": {
"label": "address 1",
"required": true,
"type": "string",
"value": ""
},
"user_address_line_2": {
"label": "address 2",
"required": false,
"type": "string",
"value": ""
},
"user_address_line_3": {
"label": "address 3",
"required": false,
"type": "string",
"value": ""
},
"user_address_postcode": {
"label": "postcode",
"required": false,
"type": "string",
"value": ""
},
"user_address_identifier": {
"label": "identifier",
"required": false,
"type": "string",
"value": ""
},
"stage": "stage1",
"last": true,
"ekyc": true,
"email": {
"label": "email address",
"required": true,
"type": "email",
"value": "test+15@mailinator.com"
},
"password": {
"label": "password",
"required": true,
"type": "string"
},
"user_title": {
"label": "title",
"required": true,
"type": "string",
"value": "Mrs"
},
"user_first_name": {
"label": "first name",
"required": true,
"type": "string",
"value": "jsns"
},
"user_last_name": {
"label": "last name",
"required": true,
"type": "string",
"value": "nsm"
},
"user_dob": {
"label": "user date of birth",
"type": "date",
"required": true,
"value": "2001-01-22"
},
"user_gender": {
"label": "gender",
"type": "string",
"required": false,
"value": "M"
},
"user_country": {
"label": "country",
"required": true,
"type": "integer",
"value": "1"
},
"user_telephone": {
"label": "telephone",
"required": false,
"type": "string",
"value": "946464646"
},
"user_name_on_card": {
"label": "card name",
"required": false,
"type": "string"
}
}
}
Я создал структуру с именем IncompleteSignupResponse
, которая при декодировании должна содержать все данные в объекте "data"
. Массив userObject предназначен для меньших объектов внутри данных, например, user_address_town
.
Ниже приведены структуры, которые я использую:
struct IncompleteSignupResponse {
let stage: String
let last: Bool
let ekyc: Bool
let error: String?
let userObject: [IncompleteUserObjectResponse]
}
struct IncompleteUserObjectResponse: Codable {
let label: String
let required: Bool
let type: String
let value: String
}
extension IncompleteSignupResponse: Codable {
private enum IncompleteSignupResponseAPIResponseCodingKeys: String, CodingKey {
case data = "data"
}
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: IncompleteSignupResponseAPIResponseCodingKeys.self)
let data = try container.decode(IncompleteSignupResponse.self, forKey: .data)
stage = data.stage
last = data.last
ekyc = data.ekyc
error = data.error
userObject = data.userObject
}
}
Попытка декодирования структуры дает следующий ответ:
keyNotFound (IncompleteSignupResponseAPIResponseCodingKeys (stringValue: "данные", intValue: ноль), Swift.DecodingError.Context (codingPath: [IncompleteSignupResponseAPIResponseCodingKeys (stringValue: "данные", intValue: ноль)], debugDescription: «Нет значений, связанных с ключевыми IncompleteSignupResponseAPIResponseCodingKeys (stringValue: \ "data \", intValue: nil) (\ "data \"). ", underError: nil))
Я не слишком уверен, почему ключевые данные не могут быть найдены, поскольку они не вложены ни в какие объекты ..
Есть что-нибудь, что я пропустил? Кроме того, мой макет считается хорошей практикой или есть вещи, которые можно улучшить.