Swift Json对象映射

Swift Json对象映射,swift,model,object-object-mapping,Swift,Model,Object Object Mapping,我想对一个url做一个Post请求,但我刚刚了解到Swift中的一个新概念,叫做对象映射。我已经学习了如何将Json对象映射到swift结构或类的所有教程,但non向我展示了如何在映射这些对象后使用它们 如何访问这些对象,以便在执行post请求时使用它们 以下是Json示例: { "country": "string", "dateOfBirth": "string", "email": "string", "gender": "string", "id": "string"

我想对一个url做一个Post请求,但我刚刚了解到Swift中的一个新概念,叫做对象映射。我已经学习了如何将Json对象映射到swift结构或类的所有教程,但non向我展示了如何在映射这些对象后使用它们

如何访问这些对象,以便在执行post请求时使用它们

以下是Json示例:

{
  "country": "string",
  "dateOfBirth": "string",
  "email": "string",
  "gender": "string",
  "id": "string",
  "interaction": {
    "deviceOS": "string",
    "deviceType": "string",
    "interactionLocation": "string",
    "interactionType": "string",
    "timeStamp": "string"
  },
  "name": "string",
  "occupation": "string",
  "passportOrIDimage": "string",
  "phoneNumber": "string",
  "physicalAddress": "string",
  "salutation": "string",
  "surname": "string",
  "userlogin": {
    "accountNonExpired": true,
    "accountNonLocked": true,
    "credentialsNonExpired": true,
    "enabled": true,
    "password": "string",
    "roles": [
      {
        "roleName": "string"
      }
    ],
    "username": "string"
  }
}
swift 4中的对象映射示例:

    struct Register: Codable {
    let country: String?
    let dateOfBirth: String?
    let email: String?
    let gender: String?
    let id: String?
    let interaction: Interaction?
    let name: String?
    let occupation: String?
    let passportOrIDimage: String?
    let phoneNumber: String?
    let physicalAddress: String?
    let salutation: String?
    let surname: String?
    let userlogin: Userlogin?

    enum CodingKeys: String, CodingKey {
        case country = "country"
        case dateOfBirth = "dateOfBirth"
        case email = "email"
        case gender = "gender"
        case id = "id"
        case interaction = "interaction"
        case name = "name"
        case occupation = "occupation"
        case passportOrIDimage = "passportOrIDimage"
        case phoneNumber = "phoneNumber"
        case physicalAddress = "physicalAddress"
        case salutation = "salutation"
        case surname = "surname"
        case userlogin = "userlogin"
    }
}

struct Interaction: Codable {
    let deviceOS: String?
    let deviceType: String?
    let interactionLocation: String?
    let interactionType: String?
    let timeStamp: String?

    enum CodingKeys: String, CodingKey {
        case deviceOS = "deviceOS"
        case deviceType = "deviceType"
        case interactionLocation = "interactionLocation"
        case interactionType = "interactionType"
        case timeStamp = "timeStamp"
    }
}

struct Userlogin: Codable {
    let accountNonExpired: Bool?
    let accountNonLocked: Bool?
    let credentialsNonExpired: Bool?
    let enabled: Bool?
    let password: String?
    let roles: [Role]?
    let username: String?

    enum CodingKeys: String, CodingKey {
        case accountNonExpired = "accountNonExpired"
        case accountNonLocked = "accountNonLocked"
        case credentialsNonExpired = "credentialsNonExpired"
        case enabled = "enabled"
        case password = "password"
        case roles = "roles"
        case username = "username"
    }
}

struct Role: Codable {
    let roleName: String?

    enum CodingKeys: String, CodingKey {
        case roleName = "roleName"
    }
}

// MARK: Convenience initializers

extension Register {
    init(data: Data) throws {
        self = try JSONDecoder().decode(Register.self, from: data)
    }

    init(_ json: String, using encoding: String.Encoding = .utf8) throws {
        guard let data = json.data(using: encoding) else {
            throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
        }
        try self.init(data: data)
    }

    init(fromURL url: URL) throws {
        try self.init(data: try Data(contentsOf: url))
    }

    func jsonData() throws -> Data {
        return try JSONEncoder().encode(self)
    }

    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
        return String(data: try self.jsonData(), encoding: encoding)
    }
}

extension Interaction {
    init(data: Data) throws {
        self = try JSONDecoder().decode(Interaction.self, from: data)
    }

    init(_ json: String, using encoding: String.Encoding = .utf8) throws {
        guard let data = json.data(using: encoding) else {
            throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
        }
        try self.init(data: data)
    }

    init(fromURL url: URL) throws {
        try self.init(data: try Data(contentsOf: url))
    }

    func jsonData() throws -> Data {
        return try JSONEncoder().encode(self)
    }

    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
        return String(data: try self.jsonData(), encoding: encoding)
    }
}

extension Userlogin {
    init(data: Data) throws {
        self = try JSONDecoder().decode(Userlogin.self, from: data)
    }

    init(_ json: String, using encoding: String.Encoding = .utf8) throws {
        guard let data = json.data(using: encoding) else {
            throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
        }
        try self.init(data: data)
    }

    init(fromURL url: URL) throws {
        try self.init(data: try Data(contentsOf: url))
    }

    func jsonData() throws -> Data {
        return try JSONEncoder().encode(self)
    }

    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
        return String(data: try self.jsonData(), encoding: encoding)
    }
}

extension Role {
    init(data: Data) throws {
        self = try JSONDecoder().decode(Role.self, from: data)
    }

    init(_ json: String, using encoding: String.Encoding = .utf8) throws {
        guard let data = json.data(using: encoding) else {
            throw NSError(domain: "JSONDecoding", code: 0, userInfo: nil)
        }
        try self.init(data: data)
    }

    init(fromURL url: URL) throws {
        try self.init(data: try Data(contentsOf: url))
    }

    func jsonData() throws -> Data {
        return try JSONEncoder().encode(self)
    }

    func jsonString(encoding: String.Encoding = .utf8) throws -> String? {
        return String(data: try self.jsonData(), encoding: encoding)
    }
}
我想把我想发布的数据放在params字典中,我不知道如何使用对象映射来实现。

我的发帖要求:

 var request = URLRequest(url: URL(string: "http://testURL")!)
request.httpMethod = "POST"
    request.httpBody = try? JSONSerialization.data(withJSONObject: params as Any, options: [])
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

let session = URLSession.shared
let task = session.dataTask(with: request, completionHandler: { data, response, error -> Void in
    print(response!)
    do {
        let json = try JSONSerialization.jsonObject(with: data!) as! Dictionary<String, AnyObject>
        let alert = UIAlertController(title: "Response", message: "message", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Ok", style: .default, handler: nil))
       print(json)
    } catch {
        print("error")
    }
})

task.resume()

}
var request=URLRequest(url:url(字符串):http://testURL")!)
request.httpMethod=“POST”
request.httpBody=try?JSONSerialization.data(其中jsonObject:params为任意值,选项:[])
request.addValue(“应用程序/json”,forHTTPHeaderField:“内容类型”)
让session=URLSession.shared
让task=session.dataTask(带:request,completionHandler:{data,response,error->Void in)
打印(响应!)
做{
让json=try JSONSerialization.jsonObject(使用:data!)作为!字典
let alert=UIAlertController(标题:“响应”,消息:“消息”,首选样式:。警报)
addAction(UIAlertAction(标题:“确定”,样式:。默认,处理程序:nil))
打印(json)
}抓住{
打印(“错误”)
}
})
task.resume()
}

如果您在结构中观察

func jsonData() throws -> Data {
    return try JSONEncoder().encode(self)
}
在您的post请求中,您可以这样使用

request.httpBody = try?  objectOfCodableStruct.jsonData()

希望对您有所帮助

谢谢您的回答,这是我错过的。此外,我最大的挑战是如何为这些对象赋值。在我的UI上,我有文本框如何将数据从phoneNumberText.text传递到我的模型,如phonenumber、姓名、称呼等@kudzi您需要在您的UI元素中手动分配它,如
self.txtPhone.text=yourModelObjc.phone
无法自动执行此操作