【问题标题】:Swift 4: JsonSerialization of object with optional values failsSwift 4:具有可选值的对象的 JsonSerialization 失败
【发布时间】:2018-11-02 08:48:21
【问题描述】:

我有下一个结构:

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 上的 Optional word,我得到了异常。我试图用下一个代码删除可选词,但没有运气:

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 字符串中的参数是:[“患者”: 患者实体(患者 ID:“fff”,名字:“rrr”, 姓氏:“rrrr”,性别:“女”,出生日期:可选(“2018-05-23”), 医疗诊断:无,治疗诊断:无,治疗目标:无)]

为了传递对象的序列化需要做什么?

例外是:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'JSON 写入中的类型无效 (_SwiftValue)'

【问题讨论】:

    标签: ios swift serialization alamofire swift4


    【解决方案1】:

    如果你想检查一个有效的生日,可选绑定不是这样做的地方,我得到了和你一样的错误。我建议您分离出从您的视图中检索输入的代码。然后,针对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"}
    

    【讨论】:

      【解决方案2】:

      如果PatientEntity 的字段与服务器期望的完全对应,那么只需将其符合Encodable:

      struct PatientEntity: Encodable {...
      

      并以这种方式序列化:

      urlRequest.httpBody = try JSONEncoder().encode(parameters)
      

      【讨论】:

        【解决方案3】:

        您的参数应该是StringNSNumberArrayDictionaryNSNull 的实例,而不是PatientEntity 类型的对象,因此请将PatientEntity 转换为dictionary

        所以参数应该是这样的

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多