iOS上的jsonObject

这篇博客介绍了如何在iOS平台上实现类似于Java中的JSONObject功能。作者通过创建并完善错误信息的代码示例,展示了在Objective-C中使用NSObject+json.h和NSObject+json.m、ATClass.h和ATClass.m以及main.m文件来实现JSON对象的解析过程。

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

看着java上的jsonObject比较眼馋,于是自己做了一个,代码如下,完善了错误信息:


NSObject+json.h

#import <Foundation/Foundation.h>

@interface NSObject (json)

-(id)jsonObject:(NSData *)data error:(NSError **)error;

-(NSData *)createJsonData:(NSError **)error;

@end


NSObject+json.m

#import "NSObject+json.h"

@implementation NSObject (json)
-(id)jsonObject:(NSData *)data error:(NSError **)error{
    id jsonObject = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:error];
    if (error ==nil&&[jsonObject count]!=0){
        @try {
            NSArray *array = [jsonObject allKeys]; //因为有可能抛出异常来
            NSArray *arrayKey = [self attributeKeys];
            //比较两个数组的元素,如果本类里面的元素包含了接受到的json字典里面的元素即可,如果不包含就抛出错误并返回nil
            NSSet *jsonSet = [NSSet setWithArray:array];
            NSSet *attributeKeySet = [NSSet setWithArray:arrayKey];
            
            if ([jsonSet isSubsetOfSet:attributeKeySet]) {
                for (NSString *strKey in array) {
                    [self setValue:[jsonObject objectForKey:strKey] forKey:strKey];
                }
            }else{
                *error = [self _createExceptionError:@"this NSData has an invalid argument"];
                return nil;
            }
        }
        @catch (NSException *exception) {
            *error = [self _createExceptionError:[NSString stringWithFormat:@"%@",exception]];
            return nil;
        }
    }else{
        *error = [self _createExceptionError:@"this NSData is an invalid argument for jsonObject"];
        return nil;
    }
    return self;
}

-(NSData *)createJsonData:(NSError *__autoreleasing *)error {
    if ([self respondsToSelector:@selector(attributeKeys)]) { //必须重载attributeKeys函数
        NSArray *array = [self attributeKeys];
        NSMutableDictionary *dic = [[NSMutableDictionary alloc]init];
        for (NSString *keyName in array) {
            [dic setObject:[self valueForKey:keyName] forKey:keyName];
        }
        return [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:error];
    }
    return nil;
}

-(NSError *)_createExceptionError:(NSString *)errorMsg{
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:errorMsg forKey:NSLocalizedDescriptionKey];
	
	return [NSError errorWithDomain:@"jsonObjectException"
	                           code:0
	                       userInfo:userInfo];
}
@end

使用方法和案例:

ATClass.h

#import <Foundation/Foundation.h>

@interface ATClass : NSObject

@property (strong) NSArray *array;
@property (strong) NSString *name;
@property NSInteger index;
@end



ATClass.m

#import "ATClass.h"

@implementation ATClass
@synthesize name,array,index;

-(id)init{
    self = [super init];
    if (self) {
        self.array = [NSArray arrayWithObjects:@"123", nil];
        self.name = @"1234";
        self.index =23;
    }
    return self;
}


-(NSArray*)attributeKeys{
    return [NSArray arrayWithObjects:@"array",@"name",@"index",nil];
}

@end



main.m

    ATClass *class = [[ATClass alloc]init];
    NSData *data = [class createJsonData:nil];
    
    class.array = [NSArray arrayWithObjects:@"321", nil];
    class.index = 32;
    NSArray *object =[NSArray arrayWithObjects:@"123312", nil];
    
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:object options:0 error:nil];
    
    NSError *error;
   // class = [class jsonObject:jsonData error:&error];
    class = [class jsonObject:data error:&error];
    NSLog(@"%@",error);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值