KlappaDeSerializer
专为Objective C编写的用于Objective C的iOS JSON映射库。
描述
自动JSON反序列化框架。主要目的是允许开发者以简单而稳健的方式将JSON转换为对象。
安装
将
pod ‘KlappaDeSerializer’
添加到您的Podfile中。
然后运行
pod install
或
pod update
然后您可以自由进行。
使用
简单案例
库提供了一个名为KLPDeserializer的静态方法类,强烈建议使用。以下是一个JSON对象示例
{
"name": "A green door",
"price": 12.50
}
根据它类的声明
@interface KLPFSimpleObject : KLPAncestor
@property NSString* name;
@property NSDecimalNumber* price;
@end
@implementation KLPFSimpleObject
@end
然后您可以按照以下方式反序列化它
KLPFSimpleObject* object = [KLPDeserializer deserializeWithString:[KLPFSimpleObject class] jsonString:json];
或
KLPFSimpleObject* object = [KLPDeserializer deserializeWithDictionary:[KLPFSimpleObject class] jsonDictionary:dict];
基本上就这样了。
嵌套对象
KlappaDeSerializer还允许您轻松反序列化具有嵌套对象的JSON。考虑以下JSON对象
{
"Title": "potato jpg",
"Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan jerawat bintik hitam dan kemerahan pada kulit Gunakan seminggu sekali sebagai",
"Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
"FileSize": 22630,
"FileFormat": "jpeg",
"Height": "362",
"Width": "532",
"Thumbnail": {
"Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
"Height": "98",
"Width": "145"
}
}
根据其类声明
@interface KLPFThumbnail : KLPAncestor
@property NSString* url;
@property NSString* height;
@property NSString* width;
@end
@implementation KLPFThumbnail
@end
@interface KLPFNestedObject : KLPAncestor
@property NSString* title;
@property NSString* summary;
@property NSString* url;
@property NSString* clickUrl;
@property NSString* refererUrl;
@property NSUInteger fileSize;
@property NSString* fileFormat;
@property NSString* height;
@property NSString* width;
@property KLPFThumbnail* thumbnail;
@end
@implementation KLPFNestedObject
@end
反序列化以完全相同的方式进行。
KLPFNestedObject* object = [KLPDeserializer deserializeWithString:[KLPFNestedObject class] jsonString:json];
或
KLPFNestedObject* object = [KLPDeserializer deserializeWithDictionary:[KLPFNestedObject class] jsonDictionary:dict];
数组解析
数组的解析与普通对象的解析略有不同,因为NSArray作为类型,不会显示它包含的对象类型。因此,为了解析数组,您必须明确指定数组中预期的类型。注意,不支持包含不同类型对象的数组(并且很可能不会支持)。让我们再次考虑以下JSON对象
{
"firstName": "John",
"lastName": "Smith",
"age": 25,
"address":
{
"streetAddress": "21 2nd Street",
"city": "New York",
"state": "NY",
"postalCode": "10021"
},
"phoneNumber":
[
{
"type": "home",
"number": "212 555-1234"
},
{
"type": "fax",
"number": "646 555-4567"
}
]
}
根据其类声明
@interface KLPFAddress : KLPAncestor
@property NSString* streetAddress;
@property NSString* city;
@property NSString* state;
@property NSString* postalCode;
@end
@implementation KLPFAddress
@end
@interface KLPFPhone : KLPAncestor
@property NSString* type;
@property NSString* number;
@end
@implementation KLPFPhone
@end
@interface KLPFNestedObjectWithArray : KLPAncestor
@property NSString* firstName;
@property NSString* lastName;
@property NSUInteger age;
@property KLPFAddress* address;
@property NSArray* phoneNumber;
@end
@implementation KLPFNestedObjectWithArray
+ (NSDictionary*) getFieldsToClassMap {
return @{@"phoneNumber": [KLPFPhone class]};
}
@end
如您所看到的,为了指定数组的类型,您必须实现以下函数
+ (NSDictionary*) getFieldsToClassMap;
它必须返回一个NSDictionary,该字典将类的字段映射到类。如果您不这样做,库将抛出异常。反序列化以完全相同的方式进行
KLPFNestedObject* object = [KLPDeserializer deserializeWithString:[KLPFNestedObject class] jsonString:json];
或
KLPFNestedObject* object = [KLPDeserializer deserializeWithDictionary:[KLPFNestedObject class] jsonDictionary:dict];
直接数组反序列化
有时您想要不是对象,而是对象的数组。KlappaDeSerializer允许您这样做。考虑以下JSON示例
[
{
"Title": "potato jpg",
"Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan jerawat bintik hitam dan kemerahan pada kulit Gunakan seminggu sekali sebagai",
"Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
"FileSize": 22630,
"FileFormat": "jpeg",
"Height": "362",
"Width": "532",
"Thumbnail": {
"Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
"Height": "98",
"Width": "145"
}
},
{
"Title": "potato jpg",
"Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan jerawat bintik hitam dan kemerahan pada kulit Gunakan seminggu sekali sebagai",
"Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
"RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
"FileSize": 22630,
"FileFormat": "jpeg",
"Height": "362",
"Width": "532",
"Thumbnail": {
"Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
"Height": "98",
"Width": "145"
}
}
]
以及类声明
@interface KLPFThumbnail : KLPAncestor
@property NSString* url;
@property NSString* height;
@property NSString* width;
@end
@implementation KLPFThumbnail
@end
@interface KLPFNestedObject : KLPAncestor
@property NSString* title;
@property NSString* summary;
@property NSString* url;
@property NSString* clickUrl;
@property NSString* refererUrl;
@property NSUInteger fileSize;
@property NSString* fileFormat;
@property NSString* height;
@property NSString* width;
@property KLPFThumbnail* thumbnail;
@end
@implementation KLPFNestedObject
@end
您可以按照以下方式反序列化数组
NSArray* objects = [KLPDeserializer deserializeWithArray:[KLPFNestedObject class] array: array];
或
NSArray* objects = [KLPDeserializer deserializeWithString:[KLPFNestedObject class] jsonString:json];
自定义字段映射
命名策略
命名策略 - 这是一个类,用于决定类中字段的名称应如何转换为JSON中的名称。KlappaDeSerializer提供了两种内置策略:KLPDefaultNamingStrategy和KLPExplicitNamingStrategy。显式命名策略将类中的字段一对一转换。例如,如果你有一个名为"awesome_field"的字段,它将在JSON中转换为字段"awesme_field"。默认命名策略将camelCase转换为snake_case,即如果你在类中有字段"awesomeField",库将在JSON中查找字段"awesome_field"。目前,不支持动态切换全局策略 - 这将在下一个版本中添加。
类局部字段映射
有时你想为某个类的一两个字段设置自定义映射,而不设置全局映射,就像命名策略一样。在KlappaInjector中,你可以通过实现功能来实现这一点
+ (NSDictionary*) getCustomFieldsMapping;
或通过实现功能
+ (id<KLPNamingStrategy>) getNamingStrategy;
在getCustomFieldsMapping函数中,你定义了一个字段如何转换为另一个字段。所以假设你在类中有字段"url",在JSON中它对应于"super_puper_awesome_url"。在这种情况下,你可以按以下方式实现函数
+ (NSDictionary*) getCustomFieldsMapping {
return @{@"url": @"super_puper_awesome_url"};
}
然而,这将使你能够逐个翻译字段。如果你想为类设置不同的命名策略(即API中的某个实体由于某种原因具有不同的命名策略),你应该实现getNamingStrategy。该函数应定义该特定类将类字段转换为JSON字段的战略。
必需属性
在你的网络模型中,有两个字段是必需的,以便程序能够运行,而你不希望传递没有这些字段的对象,这在实践中相当常见。KlappaInjector允许你指定这样的必需字段。为了做到这一点,你必须实现功能
+ (NSArray*) getRequiredFields;
基本考虑一下,你有一个名为"id"的字段在你的模型类中,并且你想它始终存在。在这种情况下,你应该按以下方式实现此函数
+ (NSArray*) getRequiredFields {
return @[@"id"];
}
因此,在这种情况下,如果KlappaInjector遇到没有"id"的JSON - 它将返回nil,即使其他字段都在这里。
警告和限制
请注意,所有你想反序列化JSON的类都必须符合KLPDeserializable协议。请勿将NSObject扩展以符合此协议,而是从KLPAncestor继承你的类。
贡献
所有贡献和反馈都非常受欢迎。如果您有任何关于 KlappaDeSerializer 的问题或疑问,您总是在问题部分询问或以 Pull Request 的形式提供修复。