Swift 4: JsonSerialization объекта с необязательными значениями терпит неудачу - PullRequest
0 голосов
/ 23 мая 2018

У меня следующая структура:

struct PatientEntity{
    let patientId: String
    let firstName: String
    let lastName: String
    let gender: String
    let birthDate: String?
    let medicalDiagnosis: String?
    let therapyDiagnosis: String?
    let therapyGoals: String?
}

Когда я пытаюсь сериализовать его в json, чтобы отправить его на сервер, я получаю исключение из-за необязательного слова в bithdate.Я попытался удалить необязательное слово с помощью следующего кода, но безуспешно:

if let bithDate = self.patientBithDateTextField.text {
    newPatient: PatientEntity = PatientEntity(
        patientId: self.patientIDTextField.text!, 
        firstName: self.patientNameTextField.text!,
        lastName: self.patientLastNameTextField.text!, 
        gender: self.getSelectedGender(), 
        birthDate: bithDate, 
        medicalDiagnosis: nil, 
        therapyDiagnosis: nil,
        therapyGoals: nil
    )

    ...call API
}

Мой код сериализации:

urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: [])

, где значение параметра:

case .createPatient(let newPatient):
            return ["patient": newPatient]

Вывод на печать выглядит следующим образом:

Параметры в строке POST: ["Patient": PatientEntity (PatientId: "fff", firstName: "rrr", lastName: "rrrr", пол: «Женщина», Дата рождения: Необязательно («2018-05-23»), медицинский Диагноз: ноль, терапияДиагностика: ноль, терапияЦели: ноль)]

Что необходимо сделать, чтобы пройтисериализация объекта не так ли?

Исключение составляет:

Завершение приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: 'Неверный тип в записи JSON (_SwiftValue)'

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Если поля PatientEntity точно соответствуют ожидаемому серверу, просто установите для него значение Encodable:

struct PatientEntity: Encodable {...

и сериализуйте следующим образом:

urlRequest.httpBody = try JSONEncoder().encode(parameters)
0 голосов
/ 24 мая 2018

Если вы хотите проверить действительную дату рождения, необязательное связывание не место для этого, и я получил ту же ошибку, что и вы.Я предлагаю вам отделить код, который получает входные данные от ваших представлений.Затем выполните тестирование if bDate != nil, как показано ниже или аналогичное.

struct PatientEntity: Encodable{
    let patientId: String
    let firstName: String
    let birthDate: String?
}

var bDate: String? = "12-12-12"
var pID: String? = "2346"
var fName: String? = "gldlfk"

if bDate != nil  {
    let newPatient: PatientEntity = PatientEntity(patientId: pID!, firstName: fName!, birthDate: bDate)
    let encoder = JSONEncoder()
    let data = try! encoder.encode(newPatient)
    print(String(data: data, encoding: .utf8)!)

}

вывод:

{"firstName":"gldlfk","birthDate":"12-12-12","patientId":"2346"}
0 голосов
/ 23 мая 2018

ваши параметры должны быть экземпляром String, NSNumber, Array, Dictionary или NSNull, а не объектом типа PatientEntity, поэтому конвертируйте PatientEntity в dictionary

так что параметр должен быть таким

["patient": ["patientId": "fff", "firstName": "rrr", "lastName": "rrrr", "gender": "Female", "birthDate": Optional("2018-05-23"), "medicalDiagnosis": nil, vtherapyDiagnosis": nil, "therapyGoals": nil]]
...