【问题标题】:How to map json response with ObjectMapper?如何使用 ObjectMapper 映射 json 响应?
【发布时间】:2016-12-31 05:26:35
【问题描述】:

我有这样的json响应

{   
  frameData = { 
    eStatus = Active;
    frameId = 12;
    "frame_IMEI" = frrrrr;
    "frame_name" = "EHTPKEIWPR_frrrrr";
    "frame_token" = "";
    "frame_user" = 7;
    "is_frameowner" = 1;
    ownerName = jyoti;
    "owner_picture" = "http";
  };
  message = "Frame added successfully.";
  status = 1;
}

我已经创建了这样的模型类

import UIKit
import ObjectMapper

class AddFrameCodeModel: Mappable {

  var status         : Bool?
  var message        : String?
  var frameData      : [FrameDataModel]?


  required init?(_ map: Map) {
    mapping(map)
  }

  func mapping(map: Map) {
    status <- map["status"]
    message <- map["message"]
    frameData <- map["frameData"]

   }

 }

 class FrameDataModel : Mappable {

   var frame_name         : String?
   var eStatus            :String?
   var frame_IMEI     : String?
   var frame_token    : String?
   var frame_user     : String?
   var frameId        : String?
   var is_frameowner  : Bool?
   var ownerName      : String?
   var owner_picture  : String?
   required init?(_ map: Map) {
     mapping(map)
   }

   func mapping(map: Map) {
     frame_name <- map["frame_name"]
     eStatus <- map["eStatus"]
     is_frameowner <- map["is_frameowner"]
     frame_IMEI <- map["frame_IMEI"]
     frame_token <- map["frame_token"]
     frame_user <- map["frame_user"]
     frameId <- map["frameId"]
     ownerName <- map["ownerName"]
     owner_picture <- map["owner_picture"]
   }
 }

但主要问题是 frameData 没有映射,因为它的 [String : Anyobject] 类型但我必须在映射时将其转换为模型类
var frameData : [String : AnyObject]? 它的成功完全映射但它没有转换成模型我也必须在模型类中转换它。我的映射代码是

let addFrameCodeData  = Mapper<AddFrameCodeModel>().map(JSONObject)

我的主要问题是 frameData 也应该被映射,但它不是映射

请给我宝贵的建议。

【问题讨论】:

  • 您是否知道您的 JSON 响应格式无效?它作为 JSON os JS 对象无效

标签: objective-c swift cocoa cocoa-touch mapping


【解决方案1】:

您可以从 FrameDataModel 类型中删除括号,因为它不是字典响应数组,并执行一些“自定义转换”,如下所示 https://github.com/Hearst-DD/ObjectMapper

但我建议您保留 JSON 提供给您的类型或将其中的一些设置为 anyObject,然后在 map 函数中处理所有转换。

我还将为“frameData”创建一个单独的模型并将其视为一个对象。

它更易于管理,将来可以进行解耦更改。

试试这个作为你的 json 响应:

import ObjectMapper

类 AddFrameCodeResponse : 可映射{

var status         : Int?
var message        : String?
var frameData      : FrameDataResponse?

required init?(_ map: Map){}

func mapping(map: Map)
{
    status <- map["status"]
    message <- map["message"]
    frameData <- map["frameData"]

}

class FrameDataResponse : Mappable{

    var eStatus = String?
    var frameId = Int?
    var frame_IMEI = String?
    var frame_name = String?
    var frame_token = String
    var frame_user = Int?
    var is_frameowner = Int?
    var ownerName = String?
    var owner_picture = String?

    required init?(_ map: Map){}

    func mapping(map: Map)
    {
        eStatus <- map["eStatus"]
        frameId <- map["frameId"]
        frame_IMEI <- map["frame_IMEI"]
        frame_name <- map["frame_name"]
        frame_token <- map["frame_token"]
        frame_user <- map["frame_user"]
        is_frameowner <- map["is_frameowner"]
        ownerName <- map["ownerName"]
        owner_picture <- map["owner_picture"]

    }
}

}

对于您的框架数据模型,试试这个,并根据需要更改类型:

导入基础

类 FrameDataModel {

let eStatus: String
let id: String
let imei: String
let name: String
let token: String
let user: Int
let isOwner: Int
let ownerName: String
let ownerPicture: String

init(eStatus: String, id: String, imei: String, name: String, token: String, user: Int, isOwner: Int, ownerName: String, ownerPicture: String) {
    self.eStatus = eStatus
    self.id = id
    self.imei = imei
    self.name = name
    self.token = token
    self.user = user
    self.isOwner = isOwner
    self.ownerName = ownerName
    self.ownerPicture = ownerPicture
}

}

对于您的地图功能,试试这个:

导入基础

类 JsonResponseToMyClassMapper { static func map(jsonResponse: AddFrameCodeResponse) -> (status: String, message: String, frameData: FrameDataModel) {

    let status : String = jsonResponse.status!

    let message : String = jsonResponse.message!

    //if you changed the types in the frameDataModel, you will need to cast it here
    let frameData : FrameDataModel = FrameDataModel(eStatus: jsonResponse.message!,
                                          id: jsonResponse.frameId!,
                                        imei: jsonResponse.frame_IMEI!,
                                        name: jsonResponse.frame_name!,
                                        token: jsonResponse.frame_token!,
                                        user: jsonResponse.frame_user!,
                                        isOwner: jsonResponse.is_frameowner!,
                                        ownerName: jsonResponse.ownerName!,
                                        ownerPicture: jsonResponse.owner_picture!)

    return (status, message, frameData)

}

}

【讨论】:

    猜你喜欢
    • 2018-03-28
    • 1970-01-01
    • 2020-09-27
    • 2019-06-21
    • 1970-01-01
    • 2016-11-15
    • 2015-10-25
    • 2019-02-12
    • 1970-01-01
    相关资源
    最近更新 更多