如何用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
相关产品推荐
相关产品推荐

