swift - 如何编码 Realm 的 List<> 类型

标签 swift realm

我正在尝试将我的 Realm 数据库编码为 JSON。除 List<> 外一切正常编码。所以我的问题是,你会如何编码 List<> ?因为List不符合Encodable neighter Decodable 协议(protocol)。

现在我正在这样做:

@objcMembers class User: Object, Codable{
    dynamic var name: String = ""
    let dogs = List<Dog>()


    private enum UserCodingKeys: String, CodingKey {
        case name
        case dogs
    }

    convenience init(name: String) {
        self.init()
        self.name = name
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: UserCodingKeys.self)
        try container.encode(name, forKey: .name)

    }



@objcMembers class Dog: Object, Codable{
    dynamic var name: String = ""
    dynamic var user: User? = nil

    private enum DogCodingKeys: String, CodingKey {
        case name
    }

    convenience init(name: String) {
        self.init()
        name = name
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: DogCodingKeys.self)
        try container.encode(name, forKey: .name)

    }
}

我正在尝试这样做:

var json: Any?
let user = RealmService.shared.getUsers()
var usersArray = [User]()
for user in users{
     usersArray.append(user)
}

let jsonEncoder = JSONEncoder()
let jsonDecoder = JSONDecoder()
let encodedJson = try? jsonEncoder.encode(portfoliosArray)


        if let data = encodedJson {
            json = try? JSONSerialization.jsonObject(with: data, options: .allowFragments)
            if let json = json {
                print(String(describing: json))
            }
        }

所以问题是我如何能够对 List<Dog>? 进行编码

最佳答案

创建具有类型属性的 Realm 对象模型类 List符合 Encodable , 你可以简单地转换 ListArrayencode(to:)方法,可以自动编码。

extension User: Encodable {
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(self.username, forKey: .username)
        let dogsArray = Array(self.dogs)
        try container.encode(dogsArray, forKey: .dogs)
    }
}

我使用的测试类(与您问题中的测试类略有不同,但我手头已经有了这些,无论变量名称如何,所讨论的方法几乎相同):

class Dog: Object,Codable {
    @objc dynamic var id:Int = 0
    @objc dynamic var name:String = ""
}

class User: Object, Decodable {
    @objc dynamic var id:Int = 0
    @objc dynamic var username:String = ""
    @objc dynamic var email:String = ""
    let dogs = List<Dog>()

    private enum CodingKeys: String, CodingKey {
        case id, username, email, dogs
    }

    required convenience init(from decoder: Decoder) throws {
        self.init()
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(Int.self, forKey: .id)
        username = try container.decode(String.self, forKey: .username)
        email = try container.decode(String.self, forKey: .email)
        let dogsArray = try container.decode([Dog].self, forKey: .dogs)
        dogs.append(objectsIn: dogsArray)
    }
}

测试编码/解码:

let userJSON = """
{
    "id":1,
    "username":"John",
    "email":"example@ex.com",
    "dogs":[
        {"id":2,"name":"King"},
        {"id":3,"name":"Kong"}
    ]
}
"""

do {
    let decodedUser = try JSONDecoder().decode(User.self, from: userJSON.data(using: .utf8)!)
    let encodedUser = try JSONEncoder().encode(decodedUser)
    print(String(data: encodedUser, encoding: .utf8)!)
} catch {
    print(error)
}

输出:

{"username":"John","dogs":[{"id":2,"name":"King"},{"id":3,"name":"Kong"}]}

关于swift - 如何编码 Realm 的 List<> 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49086660/

相关文章:

ios - Swift CLAuthorizationStatus.AlwaysAuthorized 未定义

swift - 快速点击 Post Method api 时出现问题

swift - 如果分数增加,为什么我的 SKLabelNode 会离开页面

ios - Realm 中的动态属性

swift - 过滤 Realm 对象以按属性仅获取一个(不同的)对象

swift - Realm 中的嵌套查询。 swift

swift - Realm :Swift 2 中的变量查询

swift - Swift 的字符串基础知识

ios - 在 Realm Mobile Platform 中,如何调用 self.realm.objects 到 List<Item>

swift - MTLCreateSystemDefaultDevice() 在装有 iOS 10.3 的 iPad 上返回 nil