KlappaDeSerializer 2.1.1

KlappaDeSerializer 2.1.1

测试已测试
Lang语言 Obj-CObjective C
许可证 Apache-2.0
发布最后发布2018年10月

Ilia Kosynkin维护。



  • 作者
  • Ilia Kosynkin

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 的形式提供修复。