iOS中使用KVC实现JSON数据与Objective-C实体对象之间的转换

该博客介绍了如何在iOS开发中利用Key-Value Coding(KVC)技术将接收到的JSON数据高效地转换为Objective-C实体对象,通过解析JSON为字典或数组,再用objectForKey对Contact对象属性进行赋值。文中还提到了使用<objc/runtime.h>以及创建NSObject的Category来简化这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JSON数据,一种极其常用的数据传输格式,在iOS开发当中,经常会遇到需要将JSON格式数据转换为定义的实体,如将一大串联络人的json数据转换为Contact对象的数组等,想必大家都知道有一种最常见的方式,如下:
  1. 首先将JSON解析成字典(NSDictionary)或数组(NSArray);
  2. 然后使用objectForKey分别对Contact对象的属性进行赋值。
以上方式,存在的问题:
1、大量的objectForKey,导致代码量大,增加维护成本;
2、如果JSON中增加一个字段,对应在实体对象当中,增加一个属性,同时还需要在json解析的地方进行赋值。
如果在开发中使用KVC,来实现JSON数据与实体对象之间的转换,能够很好的解决以上方式存在的问题,不说了,直接贴代码,有兴趣的可以在日常的开发当中尝试一下。
- (void)serialization:(NSString*)json
{
    NSDictionary *dataSource = [NSJSONSerialization JSONObjectWithData:[json dataUsingEncoding:NSUTF8StringEncoding]
                                                               options:NSJSONReadingMutableLeaves
                                                                 error:nil];
    [self convert:dataSource];
}

- (void)serializationWithDictionary:(NSMutableDictionary*)dictionary
{
    [self convert:dictionary];
}

- (void)convert:(NSDictionary*)dataSource
{
    for (NSString *key in [dataSource allKeys]) {
        if ([[self propertyKeys] containsObject:key]) {
            id propertyValue = [dataSource valueForKey:key];
            if (![propertyValue isKindOfClass:[NSNull class]]
                && propertyValue != nil) {
                [self setValue:propertyValue
                        forKey:key];
            }
        }
    }
}

- (NSArray*)propertyKeys
{
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    NSMutableArray *propertys = [NSMutableArray arrayWithCapacity:outCount];
    for (i = 0; i<outCount; i++)
    {
        objc_property_t property = properties[i];
        const char* char_f =property_getName(property);
        NSString *propertyName = [NSString stringWithUTF8String:char_f];
        [propertys addObject:propertyName];
    }
    free(properties);
    return propertys;
}

以上是核心代码,当然你需要引入

<objc/runtime.h>

然后创建一个NSObject的Category,将以上代码加入就OK了,超级简单。

- (

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值