You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何用ObjectMapper解析含动态键的嵌套Groups对象

解析动态键的groups字段解决方案

首先修正你现有代码里的一处错误:Friends类中lastName的映射写错了,应该对应JSON里的lastName字段,不是name:

class Friends: BaseObject {
    @objc dynamic var firstName: String = ""
    @objc dynamic var lastName: String = ""
    @objc dynamic var avatarURL: String = ""

    override func mapping(map: ObjectMapper.Map) {
        firstName <- map["firstName"]
        lastName <- map["lastName"] // 修正为对应JSON的lastName字段
        avatarURL <- map["avatar_url"]
    }
}

接下来处理动态键的groups字段:

1. 创建Group模型类

先定义对应groups内部对象的模型:

class Group: BaseObject {
    @objc dynamic var name: String = ""
    @objc dynamic var createdDate: String = ""

    override func mapping(map: ObjectMapper.Map) {
        name <- map["name"]
        createdDate <- map["createdDate"]
    }
}

2. 在Person类中添加字典属性并自定义映射

因为groups的键是动态字符串,值是Group对象,所以用[String: Group]类型的属性存储,然后在mapping方法里使用ObjectMapper的mapDictionary方法完成解析:

class Person: BaseObject {
    @objc dynamic var ID: Int = -1
    @objc dynamic var name: String = ""
    @objc dynamic var age: Int = -1
    
    var friendsList = List<Friends>()
    var groups = [String: Group]() // 添加存储动态键值对的属性
 
    override func mapping(map: ObjectMapper.Map) {
        ID <- map["id"]
        name <- map["name"]
        age <- map["age"]
        friendsList <- map["friends"]
        // 自定义解析groups字典
        groups <- mapDictionary(map["groups"])
    }
}

补充:适配Realm持久化场景(若使用Realm)

如果你的BaseObject继承自RealmObject(从List类型推测可能用到Realm),[String: Group]这种字典类型无法直接存储到Realm,可新增一个GroupWithKey类来存储键和Group信息:

class GroupWithKey: BaseObject {
    @objc dynamic var key: String = ""
    @objc dynamic var group: Group?

    override func mapping(map: ObjectMapper.Map) {
        key <- map["key"]
        group <- map["group"]
    }
}

然后修改Person类并手动遍历解析:

class Person: BaseObject {
    // 其他属性不变
    var groupsList = List<GroupWithKey>()
 
    override func mapping(map: ObjectMapper.Map) {
        // 其他字段映射...
        if let groupsDict = map["groups"].currentValue as? [String: [String: Any]] {
            groupsList.removeAll()
            for (key, groupData) in groupsDict {
                let group = Group(JSON: groupData)
                let groupWithKey = GroupWithKey()
                groupWithKey.key = key
                groupWithKey.group = group
                groupsList.append(groupWithKey)
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者mefahimrahman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 01:15:46