JSON

ObjectMapper学习笔记

字号+ 作者:H5之家 来源:H5之家 2017-03-11 16:03 我要评论( )

ObjectMapper 学习笔记那么多年过去了,从来没有认认真真的写过一回日是记,最近在看 ObjectMapper 的源代,写点日记记录点东西,帮助自己记忆。要使用 ObjectMa

ObjectMapper学习笔记

分享:

本文地址:
文章摘要:ObjectMapper学习笔记,橄榄绿爆炸物刺心刻骨,干呕涨幅张五常。

ObjectMapper 学习笔记

那么多年过去了,赌博网:从来没有认认真真的写过一回日是记,最近在看 ObjectMapper 的源代,写点日记记录点东西,帮助自己记忆。

要使用 ObjectMapper 必须实现Mappable接口中的以下两个方法:

/** 这个可用于mapping()方法前的一些验证* 返回nil就不会调用mapping()进行转换* 当然对像也就是nil了,可以对Map做一些条件判断*/init?(map: Map)/** 这个是对属性进行映射,如果这里没有对应的映射关系是不会映射的哦!!要记住了* 至于映射方法可以查看* Map.swift中下标(subscript)的方法* 和Operators.swift中自定义<-操作符的方法*/mutating func mapping(map: Map)

具体的代码流程如下草图:

当我们使用自已的对像调用 public init?(JSONString: String)方法时,这时会去调Mappable协议顶层BaseMappable协议中public init?(JSONString: String, context: MapContext? = nil)方法的默认实现,代码如下:

public init?(JSONString: String, context: MapContext? = nil) {if let obj: Self = Mapper(context: context).map(JSONString: JSONString) {self = obj} else {return nil}}该方法中会去调用Mapper中的public func map(JSONString: String) -> N?方法,其代码如下:/// Map a JSON string to an object that conforms to Mappablepublic func map(JSONString: String) -> N? {if let JSON = Mapper.parseJSONStringIntoDictionary(JSONString: JSONString) {return map(JSON: JSON)}return nil}

这个方法中先做的第一件事是调用public static func parseJSONStringIntoDictionary(JSONString: String) -> [String: Any]?方法,将String类型的json串转成字典样式([String:Any])的对像,然后调用public func map(JSON: [String: Any]) -> N?方法进一步解析,这是调用最多也是最重要的一步,我们来看代码:

public func map(JSON: [String: Any]) -> N? {let map = Map(mappingType: .fromJSON, JSON: JSON, context: context, shouldIncludeNilValues: shouldIncludeNilValues)if let klass = N.self as? StaticMappable.Type { // Check if object is StaticMappableif var object = klass.objectForMapping(map: map) as? N {object.mapping(map: map)return object}} else if let klass = N.self as? Mappable.Type { // Check if object is Mappableif var object = klass.init(map: map) as? N {object.mapping(map: map)return object}} else if N.self is ImmutableMappable.Type { // Check if object is ImmutableMappableassert(false, "'ImmutableMappable' type requires throwing version of function \(#function) - use 'try' before \(#function)")} else {// Ensure BaseMappable is not implemented directlyassert(false, "BaseMappable should not be implemented directly. Please implement Mappable, StaticMappable or ImmutableMappable")}return nil}

这里做的事情如下:

初始化一个map,做一些属性赋值,保存变量 调用自定义类的public init?(map: Map)方法,生成对象,如果返回nil就退出 调用自定义类的mutating mapping(map: Map)方法,开始映射。

1.首先会调用Map类中的各中下标方法(subscript方法),判断[String:Any]中是否存在与下标对应的字段,如果存在就将其值取出来,如果不存在跳过 2.再通过Operators类中的<-自定义操作符中取出来的值赋值给生成对象中的属性。

经过这样的转换之后就完成了从String到对象初始化赋值的操作。

就爱阅读网友整理上传,为您提供最全的知识大全,期待您的分享,转载请注明出处。

 

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

相关文章
网友点评