ObjectMapper使用
4813 ワード
きほんしよう
使用する場合、クラスまたは構造体はMappableプロトコルに従う必要があります.
JSONを交換する
サポートタイプ
Mappable Protocol
JSONを解析する場合、この機能はオブジェクトの作成に成功した後に実行されます.JSONが生成されると、オブジェクト上で呼び出される唯一の関数です.
ObjectMapperはこのコンストラクタを使用してオブジェクトを作成します.オブジェクトをシーケンス化する前に、開発者はJSONを検証するために使用できます.関数内でnilを返すと、マッピングの発生が阻止されます.
ネストされたオブジェクトのマッピング dictionaryネストマッピング Arrayネストマッピング keyには.が含まれており、ネストポイント構文を無効にする カスタムネストタイプ
カスタム変換規則
ObjectMapperは、マッピング中に値を変換するカスタム変換をサポートします.
ObjectMapperを使用して提供される変換ルール(DateTransform,DateFormatterTransform,DateForm,DateTransform,DateTransform,DictionaryTransform)のほか、TransformTypeプロトコルを実装することで変換ルールをカスタマイズすることもできます.
TransformOf
ObjectMapperは変換結果を実現するためにTransformOfクラスを提供してくれました.TransformOfは実際にTransformTypeプロトコルを実現しています.TransformOfには2つのタイプのパラメータと2つの閉パッケージパラメータがあり、タイプは変換に参加するデータのタイプを表しています.
そのまま書くこともできます
サブクラス
子クラスは親のマッピングを継承できます
汎用型
ObjectMapperは同様に汎用タイプのパラメータを処理できますが、この汎用タイプはMappableプロトコルを実装した上で正常に使用する必要があります.
Mappingコンテキスト
マッピング中に渡されるMapオブジェクトには、オプションのMapContextオブジェクトがあります.マッピング中に情報を渡す必要がある場合は、開発者が使用できます.空のプロトコルであるMapContextを実装するオブジェクトを作成し、初期化中にMapperに渡すだけです.
使用する場合、クラスまたは構造体は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
}
}
ネストされたオブジェクトのマッピング
"distance" : {
"text" : "102 ft",
"value" : 31
}
// 31 distanceValue
func mapping(map: Map) {
distanceValue
//
distance
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)