Декодирование JSON из API - Swift 5 - PullRequest
0 голосов
/ 09 июня 2019

Я не настолько хорош в построении структур для декодирования JOSN, поэтому надеялся на некоторую помощь.У меня есть следующий JSON

{
    "computer": {
        "location": {
            "username": "john.smith",
            "realname": "john smith",
            "real_name": "johnsmith",
            "email_address": "johnsmith@company.com",
            "position": "somePosition",
            "phone": "123-456-7890",
            "phone_number": "123-456-7890",
            "department": "",
            "building": "",
            "room": "someRoom01"
        }
    }
}

Я создал следующие структуры для его удержания:

struct ComputerRecord: Codable {
        public let locationRecord: Location
    }

    struct Location: Codable {
        public let record: Record
    }

    struct Record: Codable {
        public let username: String
        public let realname: String
        public let real_name: String
        public let email_address: String
        public let position: String
        public let phone: String
        public let phone_number: String
        public let department: String
        public let building: String
        public let room: String
    }

Когда я пытаюсь декодировать его и использовать его таким образом (часть большой функцииw \ обработчик завершения):

do {
    let decoder = JSONDecoder()
    let computer = try decoder.decode(jssComputerRecord.self, from: data)

    if  computer.locationRecord.record.username == nameToCheck {
        usernameSet(true, response, error)
    } else {
          print("In the else")
          usernameSet(false, response, error)
      }
} catch {
      print(error)
      usernameSet(false, response, error)
  }

Я нажал на улов и получаю эту ошибку:

keyNotFound(CodingKeys(stringValue: "locationRecord", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"locationRecord\", intValue: nil) (\"locationRecord\").", underlyingError: nil))

Я предполагаю, что это ошибка в том, как япостроил структуры для декодирования, как будто я печатаю строковую версию данных, я получаю JSON, показанный выше.

Примечание: я анонимизировал запись, но оставил точную структуру без изменений.

Любая помощь в этом была бы великолепна.

Спасибо,

Людет (Эд)

1 Ответ

2 голосов
/ 09 июня 2019

Наиболее значимым правилом является:

Имя члена структуры должно соответствовать ключу JSON, если только вы не сопоставили ключи с CodingKeys

Чтобы соответствовать соглашению об именах, я добавил snake_case преобразование

struct ComputerRecord: Codable {
    public let computer: Computer
}

struct Computer: Codable {
    public let location: Record
}

struct Record: Codable {
    public let username: String
    public let realname: String
    public let realName: String
    public let emailAddress: String
    public let position: String
    public let phone: String
    public let phoneNumber: String
    public let department: String
    public let building: String
    public let room: String
}

do {
    let decoder = JSONDecoder()
    decoder.keyDecodingStrategy = .convertFromSnakeCase
    let result = try decoder.decode(ComputerRecord.self, from: data)

    if result.computer.location.username == nameToCheck {
        usernameSet(true, response, error)
    } else {
        print("In the else")
        usernameSet(false, response, error)
    }
} catch {
      print(error)
      usernameSet(false, response, error)
  }
...