在iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类。通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化。
以前,我记得我用的是第三方的插件。但是,苹果出了这套解析后,效率也大大了超过了,所有的解析第三方类库。所以,推荐使用NSJSONSerialization类来完成转化。
一、将NSDictionary或NSArray转化为JSON串
// 首先将字典或者数组转化为Data数据 - (NSData *)toJSONData:(id)theData{ NSError *error = nil; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:theData options:NSJSONWritingPrettyPrinted error:&error]; if ([jsonData length] > 0 && error == nil){ return jsonData; }else{ return nil; } }
之后将得到的NSData类型的jsonData转为NSString类型,我们就可以得到想要的JSON串
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
二、将JSON串转化为NSDictionary或NSArray
首先将NSString类型的json串转化为NSData
[jsonString dataUsingEncoding:NSASCIIStringEncoding];
然后通过得到的Data转为NSDictionary或NSArray
// 将JSON串转化为字典或者数组 - (id)toArrayOrNSDictionary:(NSData *)jsonData{ NSError *error = nil; id jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:&error]; if (jsonObject != nil && error == nil){ return jsonObject; }else{ // 解析错误 return nil; } }
三、将JSON串与NSArray和NSDictionary的操作进行封装
当然,也有很多时候,我们将这些操作,分别定义在NSObject和NSString的一个分类中
直接贴:
1.将NSString转化为NSArray或者NSDictionary
#import "NSString+JSONCategories.h" @implementation NSString(JSONCategories) -(id)JSONValue; { NSData* data = [self dataUsingEncoding:NSUTF8StringEncoding]; __autoreleasing NSError* error = nil; id result = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; if (error != nil) return nil; return result; } @end
这样调用即可达到了对应的NSArray或者NSDictionary
NSString *str = @"[{ "id": "hu"},{"blog": "damon"}]"; NSArray *array = (NSArray*)[str JSONValue];
2.将NSArray或者NSDictionary转化为NSString
#import "NSObject+JSONCategories.h" @implementation NSObject (JSONCategories) -(NSData*)JSONString; { NSError* error = nil; id result = [NSJSONSerialization dataWithJSONObject:self options:kNilOptions error:&error]; if (error != nil) return nil; return result; } @end
四、NSString与NSArray的互转
虽然oc中,[NSString stringWithFormat:@"%@",array];可以把array转为字符串,但是这种是得到的字符串带有两边的括号,等想把该字符串再恢复成array的时候,还需要把两个括号替换掉,所以正确的做法应该是这样的
NSArray *array = [NSArray arrayWithObjects:@"sss",@"mmm",@"lll",@"kkk",@"ppp",@"ooo", nil]; //NSArray转为NSString NSString *str2 = [array componentsJoinedByString:@","]; //NSString转为NSArray NSArray *array3 = [str2 componentsSeparatedByString:@","];
如果不采用这种方式,只是用%@赋值的话,下面就是例子和打印的结果,如果不过滤括号是不行的
NSArray *array = [NSArray arrayWithObjects:@"sss",@"mmm",@"lll",@"kkk",@"ppp",@"ooo", nil]; NSString *str1 = [NSString stringWithFormat:@"%@",array]; NSString *str2 = [array componentsJoinedByString:@","]; NSLog(@"str1: %@",str1); NSLog(@"str2: %@",str2); NSArray *array2 = [str1 componentsSeparatedByString:@","]; NSArray *array3 = [str2 componentsSeparatedByString:@","]; NSLog(@"arr2: %@",array2); NSLog(@"arr3: %@",array3);
打印的结果
五、参考文章
版权属于:东哥笔记 - DongGe.org
本文链接:https://dongge.org/blog/226.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!