ObjectMapper, как я могу отобразить значение во вложенном объекте - PullRequest
0 голосов
/ 27 апреля 2018

В этом сценарии используется ObjectMapper

[{
"port": "1",
"b": [{
     "c": [{"address": 1}]
     }]
}, {
"port": "2",
"b": [{
     "c": [{"address": 2}]
     }]
}]

здесь C - объект с адресом строки и портом. Теперь, используя ObjectMapper, как мне установить значение сущности порта C.

Я написал эту вложенную часть кода

class a: NSManagedObject, Mappable {
 @NSManaged var port: NSNumber?
 @NSManaged var b: NSSet?
 private var barr: [b]?
 required public init?(map: Map) {
   let ctx = DbHelper .getContext()
   let entity = NSEntityDescription.entity(forEntityName: "a", in: ctx)
   super.init(entity: entity!, insertInto: ctx)
   mapping(map: map)
}

public func mapping(map: Map) {
  port <- map["port"]
  barr <- map["b"]
  if barr != nil
  {
      b = NSSet(array: barr!)
      barr = nil
  }
 }
}

Аналогичным образом создан и сопоставлен для сущности "B" и "C"

теперь при "C" мне нужно значение "port" от сущности "a".

1 Ответ

0 голосов
/ 27 апреля 2018

Во-первых, ваш JSON недействителен. Вы забыли " после порта: "port: "2",

Здесь решение

Структура модели:

class Port : Mappable {
 var port:String?
 var b: [C]?

 required init?(map: Map) {

 }

 func mapping(map: Map) {
    port <- map["port"]
    b <- map["b"]
 }
}

class C : Mappable {
 var c:[Address]?

 required init?(map: Map) {

 }

 func mapping(map: Map) {
    c <- map["c"]
 }
}

class Address : Mappable {
 var address:Int?

 required init?(map: Map) {

 }

 func mapping(map: Map) {
    address <- map["address"]
 }
}

Назовите это так:

if let json = "yourJson" {
                if let res:[Port] = Mapper<Port>().mapArray(JSONArray: json as! [[String : Any]]) {
                    //your port objects
                }
            }

Внимание: я делаю силовое заклинание. Ты не должен. Для Objectmapper необходим формат [[String : Any]] для json.

Я рекомендовал использовать Alamofire для запросов.

С Alamofire это работает:

    let url = "https://api.myjson.com/bins/iw6vj" //your json
    Alamofire.request(url).responseJSON { (data) in
        if let json = data.result.value {
            if let res:[Port] = Mapper<Port>().mapArray(JSONArray: json as! [[String : Any]]) {
                //your port objects
            }
        }
    }

Если вы находитесь в начале вашего проекта, вы должны использовать Codabale https://developer.apple.com/documentation/swift/codable. В Интернете много учебников. Ищите Alamofire + Codable, и вы можете легко обработать запрос + анализ.

Подсказка: Ваше имя очень запутанное. Посмотрите эту статью https://medium.com/coding-skills/clean-code-101-meaningful-names-and-functions-bf450456d90c Это также помогает для структуры модели.

...