如何在对象内部的对象上使用Codable编码

埃德加

我正在使用对象有效负载来处理JSON有效负载。但是我在对象内部编码对象时遇到麻烦。

我的有效载荷课程是这个

class ConversationPayload :BaseObject {
    var title : String? = ""
    var messageDict: MessagePayload = MessagePayload()
    var participants: [Int32] = []
    var type: String = ""
    
    enum CodingKeys: String, CodingKey {
        case title = "title"
        case messageDict = "message"
        case participants = "participants"
        case type = "type"
    }

    override func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        if title != nil {
            try container.encode(title, forKey: .title)
        }
        try container.encode(messageDict, forKey: .messageDict)
        try container.encode(participants, forKey: .participants)
        try container.encode(type, forKey: .type)
    }
    
}

class MessagePayload: BaseObject {
    var body : String = ""
    var isVideocallInvite: Bool = false
    var attachmentsPayload: MessageAttachmentPayload? = nil
    
    enum CodingKeys: String, CodingKey {
        case body = "body"
        case isVideocallInvite = "is_videocall_invite"
        case attachmentsPayload = "attachment"
    }

    override func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(body, forKey: .body)
        try container.encode(isVideocallInvite, forKey: .isVideocallInvite)
        if attachmentsPayload != nil {
            try container.encode(attachmentsPayload, forKey: .attachmentsPayload)
        }
        
    }
}

class MessageAttachmentPayload: BaseObject {
    var photo : String = ""
    var photoType : String = "jpg"
}

BaseObject是这个

class BaseObject:Codable{}

我想要在JSON负载中获取的内容是这样的

{"message": {"body": "body_string", "is_videocall_invite": 1}, "participants" : [user-id], "type" : "converstation_type","title":"title"}

有人知道我的有效载荷类怎么了吗?尚未对编码感到熟悉。提前致谢。

杰弗里·托马斯(Jeffery Thomas)

我不确定您在这里受到什么限制,但是我会简化所有这些步骤。保持JSON数据模型尽可能接近JSON。

struct ConversationJsonModel: Codable {
    var title: String?
    var message: MessageJsonModel
    var participants: [Int]
    var type: String
}

struct MessageJsonModel: Codable {
    var body: String
    var is_videocall_invite: Int
    var attachment: AttachmentJsonModel?
}

struct AttachmentJsonModel: Codable {
    var photo: String
    var photo_type: String // <-- assuming photo_type is the JSON member name.
}

如果您需要视图模型或其他某种本地数据模型,则这两部分是分开的。

class BaseObject {}

class ConversationPayload: BaseObject {
    var title : String? = ""
    var messageDict: MessagePayload = MessagePayload()
    var participants: [Int32] = []
    var type: String = ""

    func makeConversationJsonModel() -> ConversationJsonModel {
        ConversationJsonModel(title: title,
                              message: messageDict.makeMessageJsonModel(),
                              participants: participants.map { Int($0) },
                              type: type)
    }
}

class MessagePayload: BaseObject {
    var body : String = ""
    var isVideocallInvite: Bool = false
    var attachmentsPayload: MessageAttachmentPayload? = nil

    func makeMessageJsonModel() -> MessageJsonModel {
        MessageJsonModel(body: body,
                         is_videocall_invite: isVideocallInvite ? 1 : 0,
                         attachment: attachmentsPayload?.makeAttachmentJsonModel())
    }
}

class MessageAttachmentPayload: BaseObject {
    var photo : String = ""
    var photoType : String = "jpg"

    func makeAttachmentJsonModel() -> AttachmentJsonModel {
        AttachmentJsonModel(photo: photo, photo_type: photoType)
    }
}

最后,编码您的JSON

let conversationPayload = ConversationPayload()
let json = try? JSONEncoder().encode(conversationPayload.makeConversationJsonModel())

这允许在JSON表示和有效负载模型之间进行清晰的分离。例如,在JSON中,is_videocall_inviteInt(0或1);同时,在有效负载模型中,isVideocallInviteBool

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章