Mantle、JSONModel、MJExtension、YYM
2017-11-17 本文已影响512人
丘山Ivan
Mantle
-
可定制性高、功能丰富,文档完善,使用广泛
-
要求所有模型类必须继承自MTModel基类.
-
使用了KVC的方法来验证要赋的值的类型是否和key的类型是否匹配.
-
如果服务器数据和代码中定义的值类型不相同,不做处理会Carsh。所以基本每个字段都需要做判断处理。
-
需要在.m文件中将JSON字典里的键对应的值,赋值给属性.赋值的时候可以直接使用独有的'.',可以减少使用objectForKey。
// 伪代码 + (NSDictionary *)JSONKeyPathsByPropertyKey { return @{ //将JSON字典里dt键对应的值,赋值给date属性 @"date": @"dt", //这个点‘.’是什么意思呢,表示将main键对应的子字典里, //temp键对应的值赋给temperature属性。 //我们不用再写 objectForKey]objectForKey]..这种代码了。 //注意了:当main键对应的是数组时,main.temp返回的 //为所有temp键对应值的数组合集 @"height": @"main.height" }; }
-
Json->Model
-
modelOfClass:fromJSONDictionary:error
该方法会调用key-key map方法。Mantle不会自动转类型,如:String->Int, 一旦类型不匹配,直接crash. -
modelWithDictionary:error:
简单的使用KVC进行赋值。不会调用key-key map方法, 要求属性和JSON字典中的key名称相同,否则就crash
-
-
Model -> JSON
-
JSONDictionaryFromModel:error:
一旦有属性为nil, Mantle会转换成NSNull对象放到JSON字典中,这里有一个坑,使用NSUserDefault存储这样的JSON字典时,程序crash,原因是不可以包含NSNull对象。
-
JSONModel
- 简洁的接口
- 要求所有模型类必须继承自JSONModel基类
- 服务端数字,客户端NSString,或服务器端字符,客户端NSNumber,这样比较简单的转换
- 如果代码定义的是基本数据类型,而服务端返回了数组。这时候需要写一个转换方法,如果没有写,JSONModel会抛出一个异常。
- 当服务器传字符,客户端为NSUInteger类型时,Mantle,JSONModel都会崩溃
- 归档的方式:它不是将对象归档,而是转换成字典再归档。
MJExtension
- 不需要你的模型类继承任何特殊基类,毫无污染,毫无侵入性
- 是一套字典和模型之间互相转换的超轻量级框架
- 字典(JSON)-->模型(Model)-->字典(JSON)
- 字典数组(JSON Array)-->模型数组(Model Array)-->字典数组(JSON Array)
- 类型不匹配那么对应的属性将被赋值为nil.
- 当服务器传字符,客户端为NSUInteger类型时,不会崩溃
- 可以直接使用对象归档
- 有自定义属性转换方式的,可以让开发者自定义类型检测、值过滤来保护App的Crash
YYModel
- 不支持自定义属性转换方式的
- 高性能:转换效率接近手写代码。
- 自动类型转换:对象类型能自动转换。
- 类型安全:在转换过程中所有的类型都会被验证,以确保类型安全。
- 非侵入性:不需要让模型类继承自基类。
- 轻量级:整个库只包含5个文件。
-
文档和测试覆盖:100%文档覆盖,99.6代码覆盖。
image
转换速率:
YYModel>MJExtension>JSONModel>Mantle
防崩溃能力比较
YYModel>MJExtension>JSONModel>Mantle
参考:
iOS JSON 模型转换库评测