JSON和XML是2种常用的数据交换格式,因JSON更轻量故而在手机App开发时成为首选,在App开发中我们经常需要把Model转换成JSON格式的数据来与服务器通信,iOS开发中常见的JSON模型转换库有:JSONModel、Mantle、FastEasyMapping、MJExtension、YYModel等,自己只学习了JSONModel的源码,在此整理记录下,算是对JSONModel源码学习的总结。
##JSONModel目录结构
JSONModel目录结构如下图所示:

JSONModel
核心模块,主要实现JSONString与Model互相转换。JSONModelClassProperty描述Model的属性。
JSONModelTransformations
值映射转换模块,JSONKeyMapper是键值转化,JSONValueTransformer是不同类型值之间的转换。
JSONModelNetworking
网络模块,暂时不用关注,一般iOS中网络模块都是用AFNetworking。
JSONModel框架结构
- String->Model

- Model->String

JSONModel关键技术
从JSONModel框架结构中可以看出JSONModel的核心技术有2个:NSJSONSerialization和KVC。
NSJSONSerialization:实现了string与dictionary的互相转换,关于如何实现NSJSONSerialization可参考知乎专栏上从零开始的 JSON 库教程。
KVC:KVC技术实现了value的赋值与获取,读取dictionary中的value,然后赋值给Model中的属性;或者从Model中读取value然后添加到dictionary中。
Class的Properties获取
KVC使用的前提是:需要知道目标对象的属性(名称、类型),在Objective-C中利用Runtime API可以获取属性相关信息:
- class_copyPropertyList //获取属性列表
- property_getName //获取属性名称
- property_getAttributes //获取属性“属性”(类型、mutable、readonly等)
PropertyDescription
- NSInterger对应的PropertyAttributes是Tq,N,V_id
- NSString对应的PropertyAttributes是:T@”NSString”,&,N,V_name
具体PropertyAttributes参照Objective-C Runtime Programming Guide

解析PropertyDescription
解析property用的是NSScanner类,就是对PropertyDescription字符串的解析,解析出该Property是什么类型,是否是mutable,是否conform to protocol等等,具体实现方法参考源码中以下方法:
1 | -(void)__inspectProperties |
大体解析流程如下图所示:

JSONString->JSONModel实现过程
String->Dictionary,遍历属性,通过Mapper获取jsonKeyPath,通过KVC获取jsonValue,处理primitives,如果是基本类型直接KVC赋值,如果是JSONModel子类则递归赋值,如果属性遵循protocol(集合类型),则进行相关转化,如果是标准JSON类型直接KVC赋值,其它场景则通过ValueTransformer转换成JSON标准格式,具体实现参考源码中以下方法:
1 | -(NSDictionary*)toDictionaryWithKeys:(NSArray*)propertyNames |
JSONModel->JSONString实现过程
通过Mapper拿到keyPath,再通过KVC拿到value,检测该属性有无自定义getter,如果有责直接KVC添加到dictionary中,检测value类型是否是JSONModel类型,如果是则递归赋值,检查该属性是否遵循protocol,如果是则转换value,检测该属性是否是标准JSON类型或者是基本类型,如果是则添加到dictionary中,其它场景则利用valueTransformer把value转换成JSON格式类型值,然后KVC添加到dictionary中,最后dictionary->data->string。具体方法参考源码中以下方法:
1 | -(id)initWithDictionary:(NSDictionary*)dict error:(NSError**)err |
结束语
国内YYKit作者写了一篇关于iOS常见JSON模型转换库的评测博文,有兴趣的可以看下iOS JSON 模型转换库评测