ObjectMapper使用

4813 ワード

きほんしよう
使用する場合、クラスまたは構造体はMappableプロトコルに従う必要があります.
class User: Mappable {
    var username: String?
    var age: Int?
    var weight: Double!
    var array: [Any]?
    var dictionary: [String : Any] = [:]
    var bestFriend: User?                       // Nested User object
    var friends: [User]?                        // Array of Users
    var birthday: Date?

    required init?(map: Map) {

    }

    // Mappable
    func mapping(map: Map) {
        username    >> map["    JSON    "]
    }
}


JSONを交換する
let user = User(JSONString: JSONString)
let JSONString = user.toJSONString(prettyPrint: true)

      
let user = Mapper().map(JSONString: JSONString)
let JSONString = Mapper().toJSONString(user, prettyPrint: true)


サポートタイプ
Int
Bool
Double
Float
String
RawRepresentable (Enums)
Array
Dictionary
Object
Array
Array>
Set
Dictionary
Dictionary>


Mappable Protocol mutating func mapping(map: Map)
JSONを解析する場合、この機能はオブジェクトの作成に成功した後に実行されます.JSONが生成されると、オブジェクト上で呼び出される唯一の関数です.init?(map: Map)
ObjectMapperはこのコンストラクタを使用してオブジェクトを作成します.オブジェクトをシーケンス化する前に、開発者はJSONを検証するために使用できます.関数内でnilを返すと、マッピングの発生が阻止されます.
required init?(map: Map){
    // check if a required "name" property exists within the JSON.
    if map.JSON["name"] == nil {
        return nil
    }
}


ネストされたオブジェクトのマッピング
  • dictionaryネストマッピング
  • "distance" : {
         "text" : "102 ft",
         "value" : 31
    }
    
    //   31      distanceValue
    func mapping(map: Map) {
        distanceValue 
  • Arrayネストマッピング
  • //             
    distance 
  • keyには.が含まれており、ネストポイント構文を無効にする
  • func mapping(map: Map) {
        identifier 
  • カスタムネストタイプ
  • {
      "kr.xoul.user": {
        "kr.xoul.name": "Suyeol Jeon",
        "kr.xoul.username": "devxoul"
      }
    }
    
    //     ,mapping          
    
    func mapping(map: Map) {
      // this will parse the key as ["kr"]["xoul"]["user"]["kr"]["xoul"]["name"]
      name kr.xoul.name", delimiter: "->"]
    }
    
    
    

    カスタム変換規則
    ObjectMapperは、マッピング中に値を変換するカスタム変換をサポートします.
    class People: Mappable {
       var birthday: NSDate?
    
       required init?(_ map: Map) {
    
       }
    
       func mapping(map: Map) {
           birthday ().map(JSON)
    }
    
    

    ObjectMapperを使用して提供される変換ルール(DateTransform,DateFormatterTransform,DateForm,DateTransform,DateTransform,DictionaryTransform)のほか、TransformTypeプロトコルを実装することで変換ルールをカスタマイズすることもできます.
    public protocol TransformType {
        associatedtype Object
        associatedtype JSON
    
        func transformFromJSON(_ value: Any?) -> Object?
        func transformToJSON(_ value: Object?) -> JSON?
    }
    
    

    TransformOf
    ObjectMapperは変換結果を実現するためにTransformOfクラスを提供してくれました.TransformOfは実際にTransformTypeプロトコルを実現しています.TransformOfには2つのタイプのパラメータと2つの閉パッケージパラメータがあり、タイプは変換に参加するデータのタイプを表しています.
    let transform = TransformOf(fromJSON: { (value: String?) -> Int? in 
        return Int(value!)
    }, toJSON: { (value: Int?) -> String? in
        if let value = value {
            return String(value)
        }
        return nil
    })
    
    //     
    id 

    そのまま書くこともできます
    id (fromJSON: { Int($0!) }, toJSON: { $0.map { String($0) } }))
    
    

    サブクラス
    子クラスは親のマッピングを継承できます
    class Base: Mappable {
        var base: String?
        
        required init?(map: Map) {
    
        }
    
        func mapping(map: Map) {
            base 

    汎用型
    ObjectMapperは同様に汎用タイプのパラメータを処理できますが、この汎用タイプはMappableプロトコルを実装した上で正常に使用する必要があります.
    class Result: Mappable {
        var result: T?
    
        required init?(map: Map){
    
        }
    
        func mapping(map: Map) {
            result >().map(JSON)
    
    

    Mappingコンテキスト
    マッピング中に渡されるMapオブジェクトには、オプションのMapContextオブジェクトがあります.マッピング中に情報を渡す必要がある場合は、開発者が使用できます.空のプロトコルであるMapContextを実装するオブジェクトを作成し、初期化中にMapperに渡すだけです.
    struct Context: MapContext {
        var importantMappingInfo = "Info that I need during mapping"
    }
    
    class User: Mappable {
        var name: String?
        
        required init?(map: Map){
        
        }
        
        func mapping(map: Map){
            if let context = map.context as? Context {
                // use context to make decisions about mapping
            }
        }
    }
    
    let context = Context()
    let user = Mapper(context: context).map(JSONString)