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

如何用ObjectMapper为嵌套实体C设置Port属性值?

如何用ObjectMapper为嵌套实体C设置外层的port属性值

我来给你捋捋怎么解决这个问题——你是在Core Data环境下用ObjectMapper解析嵌套JSON,需要把最外层对象的port值传递给深层的C实体对吧?核心思路就是逐层传递port值,从a到b再到C,具体实现步骤如下:

1. 完善a类的解析逻辑

class a: NSManagedObject, Mappable {
    @NSManaged var port: NSNumber?
    @NSManaged var b: NSSet?
    private var barr: [b]? // 临时存储解析的b数组,后续转成NSSet适配Core Data

    required public init?(map: Map) {
        let ctx = DbHelper.getContext()
        guard let entity = NSEntityDescription.entity(forEntityName: "a", in: ctx) else {
            return nil
        }
        super.init(entity: entity, insertInto: ctx)
    }

    func mapping(map: Map) {
        // 解析自身的port属性
        port <- map["port"]
        // 解析b数组到临时变量barr
        barr <- map["b"]
        
        // 把当前a的port传递给每个b对象
        barr?.forEach { bObj in
            bObj.parentPort = port
        }
        
        // 将临时数组转成NSSet赋值给Core Data的b属性
        if let barr = barr {
            b = NSSet(array: barr)
        }
    }
}

2. 实现b类的中转传递

class b: NSManagedObject, Mappable {
    @NSManaged var c: NSSet?
    private var carr: [C]?
    var parentPort: NSNumber? // 临时存储从a传来的port值

    required public init?(map: Map) {
        let ctx = DbHelper.getContext()
        guard let entity = NSEntityDescription.entity(forEntityName: "b", in: ctx) else {
            return nil
        }
        super.init(entity: entity, insertInto: ctx)
    }

    func mapping(map: Map) {
        // 解析c数组到临时变量carr
        carr <- map["c"]
        
        // 把从a拿到的port传递给每个C对象
        carr?.forEach { cObj in
            cObj.port = parentPort
        }
        
        // 将临时数组转成NSSet赋值给Core Data的c属性
        if let carr = carr {
            c = NSSet(array: carr)
        }
    }
}

3. 完成C实体的定义

class C: NSManagedObject, Mappable {
    @NSManaged var address: NSNumber?
    @NSManaged var port: NSNumber?

    required public init?(map: Map) {
        let ctx = DbHelper.getContext()
        guard let entity = NSEntityDescription.entity(forEntityName: "C", in: ctx) else {
            return nil
        }
        super.init(entity: entity, insertInto: ctx)
    }

    func mapping(map: Map) {
        // 解析JSON里的address属性
        address <- map["address"]
        // port不需要从JSON解析,由上层b对象传递过来
    }
}

关键逻辑说明

  • 因为Core Data的集合属性是NSSet类型,所以我们用临时的数组属性(barr、carr)接收ObjectMapper解析的数组,之后再转成NSSet赋值给Core Data属性。
  • 通过在b类中添加临时的parentPort属性,实现从外层a到中层b的port传递,再由b传递给深层的C实体,确保每个C实体都能拿到对应外层a的port值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:05:26