- JSON对象取值
- JSON对象取值的异常处理
正文
- JSON对象取值
对于采用JSON格式的接口数据,一般的客户端会先将JSON字符串转成JSON对象,再进行后续操作。
iOS自带的json解析器NSJSONSerialization.
对NSJSONSerialization封装,NSString的扩展方法toJSONObject
@implementation NSString (JSON)
- (id)toJSONObject
{
return [NSJSONSerialization JSONObjectWithData:[self dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
}
@end
这里的id有2种情况数组NSArray 和 字典NSDictionary。这里讨论的JSON对象取值,指的是NSArray和NSDictionary的取值。
NSArray 的取值方法:
- (ObjectType)objectAtIndex:(NSUInteger)index;
NSDictionary 的取值方法:
- (nullable ObjectType)objectForKey:(KeyType)aKey;
JSON对象取值的异常处理
通常我们会在在已知数据类型的情况下使用实例方法。但由于oc是运行时语言,变量的数据类型是根据运行的情况确定的。这就会出现代码运行时,变量不是我们期望的数据类型,在后续的处理中就会出现,调用了不存在的方法名。那么如何避免呢?
- 条件语句判断
- 确保数据类型
采用条件语句(if)来分流是通常的做法。
这里解析这二种做法:确保数据类型。
//
id AI_defaultValue(id object, id defaultValue)
{
if (AI_isEmptyObject(object)) {
return defaultValue;
}
if ([object isKindOfClass:[NSArray class]]
&&[defaultValue isKindOfClass:[NSArray class]]) {
return object;
}else if ([object isKindOfClass:[NSDictionary class]]
&&[defaultValue isKindOfClass:[NSDictionary class]]) {
return object;
}else if ([object isKindOfClass:[NSString class]]
&&[defaultValue isKindOfClass:[NSString class]]) {
return object;
}else if ([object isKindOfClass:[NSNumber class]]
&&[defaultValue isKindOfClass:[NSString class]]) {
return [NSString stringWithFormat:@"%@",object];
}else if (![defaultValue isKindOfClass:[object class]]) {
return defaultValue;
}
return object;
}
+ (id)setObj:(id)object withDefaultValue:(id)defaultValue
{
return AI_defaultValue(object, defaultValue);
}
//判断对象是否为空
BOOL AI_isEmptyObject(id object)
{
if ([object isEqual:[NSNull null]]) {
return YES;
}else if ([object isKindOfClass:[NSString class]]) {
if ([(NSString *)object length] == 0) {
return YES;
}
}else if ([object isKindOfClass:[NSArray class]]) {
if ([(NSArray *)object count] == 0) {
return YES;
}
}else if ([object isKindOfClass:[NSDictionary class]]) {
if ([(NSDictionary *)object count] == 0) {
return YES;
}
}
return NO;
}
#define ID_VALUE(obj,defaultValue) AI_defaultValue(obj,defaultValue)
NSDictionary *dic = @{@"a":@"b"};
第一种方式
NSString *str;
if([dic[@"a"] isKindOfClass:[NSString class]])
{
str = dic[@"a"];
}else {
str = @"";
}
第二种方式
NSString *str = ID_VALUE(dic[@"a"],@"");
这样做好处相比于第一种的有点比较明显:代码量少,代码层级清晰。
说完优点,也说是缺点:优点比较明显,缺点也比较明显。if判断的方式,可以避免后续操作中不必要的逻辑执行,而第二种会设置默认值,后续流程会继续无意义执行。
好的,编码最重要的思路,这里不仅提供了思路,还有代码。
需要代码的朋友去这个地址下载
https://git.oschina.net/zify/ZFFoundation.git