JSON

ObjectMapper文档中文翻译

字号+ 作者:H5之家 来源:H5之家 2016-11-11 15:01 我要评论( )

ObjectMapper-CN-Guide 文档由Swift老司机活动中心负责翻译,欢迎关注@SwiftOldDriver。翻译有问题可以到 ObjectMapper-CN-Guide 提 PR。 ObjectMapper 是一个使

> 软件编程 > IOS开发 >

ObjectMapper文档中文翻译 2016-11-11 10:13 出处:清屏网 人气: 

ObjectMapper-CN-Guide

文档由Swift老司机活动中心负责翻译,欢迎关注@SwiftOldDriver。翻译有问题可以到 ObjectMapper-CN-Guide 提 PR。

ObjectMapper 是一个使用 Swift 编写的用于 model 对象(类和结构体)和 JSON 之间转换的框架。

  • 特性
  • 基础使用方法
  • 映射嵌套对象
  • 自定义转换规则
  • 继承
  • 泛型对象
  • 映射时的上下文对象
  • ObjectMapper + Alamofire
  • ObjectMapper + Realm
  • 待完成
  • 安装
  • 特性:
  • 把 JSON 映射成对象
  • 把对象映射 JSON
  • 支持嵌套对象 (单独的成员变量、在数组或字典中都可以)
  • 在转换过程支持自定义规则
  • 支持结构体( Struct )
  • Immutable support(目前还在 beta )
  • 基础使用方法

    为了支持映射,类或者结构体只需要实现 Mappable 协议。这个协议包含以下方法:

    init?(map: Map) mutating func mapping(map: Map)

    ObjectMapper使用自定义的 <- 运算符来声明成员变量和 JSON 的映射关系。

    class User: Mappable { var username: String? var age: Int? var weight: Double! var array: [AnyObject]? var dictionary: [String : AnyObject] = [:] var bestFriend: User? // 嵌套的 User 对象 var friends: [User]? // Users 的数组 var birthday: NSDate? required init?(map: Map) { } // Mappable func mapping(map: Map) { username <- map["username"] age <- map["age"] weight <- map["weight"] array <- map["arr"] dictionary <- map["dict"] bestFriend <- map["best_friend"] friends <- map["friends"] birthday <- (map["birthday"], DateTransform()) } } struct Temperature: Mappable { var celsius: Double? var fahrenheit: Double? init?(map: Map) { } mutating func mapping(map: Map) { celsius <- map["celsius"] fahrenheit <- map["fahrenheit"] } }

    一旦你的对象实现了 Mappable , ObjectMapper就可以让你轻松的实现和 JSON 之间的转换。

    把 JSON 字符串转成 model 对象:

    let user = User(JSONString: JSONString)

    把一个 model 转成 JSON 字符串:

    let JSONString = user.toJSONString(prettyPrint: true)

    也可以使用 Mapper.swift 类来完成转换(这个类还额外提供了一些函数来处理一些特殊的情况:

    // 把 JSON 字符串转成 Model let user = Mapper<User>().map(JSONString: JSONString) // 根据 Model 生成 JSON 字符串 let JSONString = Mapper().toJSONString(user, prettyPrint: true)

    ObjectMapper支持以下的类型映射到对象中:

  • Int
  • Bool
  • Double
  • Float
  • String
  • RawRepresentable (枚举)
  • Array<AnyObject>
  • Dictionary<String, AnyObject>
  • Object<T: Mappable>
  • Array<T: Mappable>
  • Array<Array<T: Mappable>>
  • Set<T: Mappable>
  • Dictionary<String, T: Mappable>
  • Dictionary<String, Array<T: Mappable>>
  • 以上所有的 Optional 类型
  • 以上所有的隐式强制解包类型(Implicitly Unwrapped Optional)
  • Mappable 协议 mutating func mapping(map: Map)

    所有的映射最后都会调用到这个函数。当解析 JSON 时,这个函数会在对象创建成功后被执行。当生成 JSON 时就只有这个函数会被对象调用。

    init?(map: Map)

    这个可失败的初始化函数是 ObjectMapper 创建对象的时候使用的。开发者可以通过这个函数在映射前校验 JSON 。如果在这个方法里返回 nil 就不会执行 mapping 函数。可以通过传入的保存着 JSON 的 Map 对象进行校验:

    required init?(map: Map){ // 检查 JSON 里是否有一定要有的 "name" 属性 if map.JSONDictionary["name"] == nil { return nil } } StaticMappable 协议

    StaticMappable 是 Mappable 之外的另一种选择。 这个协议可以让开发者通过一个静态函数初始化对象而不是通过 init?(map: Map) 。

    注意: StaticMappable 和 Mappable 都继承了 BaseMappable 协议。 BaseMappable 协议声明了 mapping(map: Map) 函数。

    static func objectForMapping(map: Map) -> BaseMappable?

    ObjectMapper 使用这个函数获取对象后进行映射。开发者需要在这个函数里返回一个实现 BaseMappable 对象的实例。这个函数也可以用于:

  • 在对象进行映射前校验 JSON
  • 提供一个缓存过的对象用于映射
  • 返回另外一种类型的对象(当然是必须实现了 BaseMappable)用于映射。比如你可能通过检查 JSON 推断出用于映射的对象 (看这个例子)。
  • 如果你需要在 extension 里实现 ObjectMapper,你需要选择这个协议而不是 Mappable 。

    ImmutableMappable Protocol (Beta)

    :warning: 这个特性还处于 Beta 阶段。正式发布时 API 可能会完全不同。

    使用 ImmutableMappable 可以映射不可变的属性。下面的表格展示了 ImmutableMappable 和 Mappable 的不同:

    ImmutableMappable Mappable

    Properties

    let id: Int let name: String? var id: Int! var name: String?

    JSON -> Model

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    网友点评