当前位置: 首页 > 知识库问答 >
问题:

Swift 4:带有可选值的对象序列化失败

葛霄
2023-03-14

我有下一个结构:

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

为了跳过对象权限的序列化,需要做什么?

例外情况是:

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

共有3个答案

丁宏盛
2023-03-14

如果< code>PatientEntity的字段与服务器期望的完全一致,那么只需使其符合Encodable即可:

struct PatientEntity: Encodable {...

并以这种方式序列化:

urlRequest.httpBody = try JSONEncoder().encode(parameters)
顾池暝
2023-03-14

您的参数应该是< code>String、< code>NSNumber、< code>Array、< code>Dictionary或< code>NSNull的实例,而不是< code>PatientEntity类型的对象,因此请将< code>PatientEntity转换为< code>dictionary

所以参数应该是这样的

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

如果你想检查一个有效的出生日期,可选绑定不是这样做的地方,我得到了和你一样的错误。我建议您分离出从视图中检索输入的代码。然后,测试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"}
 类似资料:
  • 我试图将JSON字符串反序列化为Java对象,但遇到以下异常: JsonDeserializer com.google.gson.DefaultTypeAdapters$CollectionTypeAdapter@306A30C7未能对给定类型类java.util.ArrayList的json对象[“93”]进行反序列化 我的主文件: 应该表示JSON的类是: 我尝试了SO上给出的解决方案,但也有

  • 我正在试验Stanford CoreNLP库,我想序列化主要的StanfordCoreNLP管道对象,尽管它抛出了一个java.io.NotSerializableException。 完整故事:每当我运行我的实现时,将管道注释器和分类器加载到内存中大约需要15秒。最终进程的内存约为600MB(很容易小到可以存储在我的机箱中)。我想在第一次创建管道后保存它,这样我就可以在以后将其读入内存。 然而,

  • 问题内容: 我有一个对象(解析树),其中包含子节点,这些子节点是对其他节点的引用。 我想使用序列化此对象,但是我得到了 TypeError:循环对象值 因为我提到的结构。 我该如何解决?对我而言,在序列化对象中是否表示对其他节点的引用并不重要。 另一方面,在创建对象时从对象中删除这些属性似乎很乏味,我也不想对解析器(水仙)进行更改。 问题答案: 使用的第二个参数,该替代品的功能,以排除已序列化对象

  • 问题内容: 我正在尝试反序列化(使用gson)如下所示的JSON对象: 我该如何处理?我什至不知道该怎么称呼- 这里代表了多个“项目”,但这不是一个数组。当我尝试将其反序列化为数组时,程序在“预期的Begin_Array但找到Begin_Object”异常时崩溃。当我尝试将其反序列化为Strong对象时(请参见下面的类),程序将运行,但所有字段均返回null。 这是我尝试将其映射到的类: 完整的J

  • 我有以下用于序列化查询集的代码: 下面是我的 我需要将其序列化。但它说无法序列化

  • 问题内容: 我正在尝试使用Gson反序列化从Web服务返回的json字符串 该结构将以返回。 哪里像 和ItemDTO就像 当我按如下方式调用代码时 对象内部的所有内容均为空 但是,如果我使用 并将它们从org.json罐子中逐段拉出,效果很好,并相应地填充了字段。 关于我在做什么错的任何想法吗?Gson非常快吗?还是我最好坚持自己已经做的工作​​? 谢谢大卫 问题答案: 原始问题中的示例Java