在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</h2><p><span style="line-height:1.5;">首先将NSString类型的json串转化为NSData</span></p><pre class="prettyprint linenums">[jsonString dataUsingEncoding:NSASCIIStringEncoding];</pre><p>然后通过得到的Data转为NSDictionary或NSArray</p><pre class="prettyprint linenums">// 将JSON串转化为字典或者数组
二、将JSON串转化为NSDictionary或NSArray</h2><p><span style="line-height:1.5;">首先将NSString类型的json串转化为NSData</span></p><pre class="prettyprint linenums">[jsonString dataUsingEncoding:NSASCIIStringEncoding];</pre><p>然后通过得到的Data转为NSDictionary或NSArray</p><pre class="prettyprint linenums">// 将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的操作进行封装</h2><p><span style="line-height:1.5;">当然,也有很多时候,我们将这些操作,分别定义在NSObject和NSString的一个分类中</span></p><p>
直接贴:</p>
<h3>1.将NSString转化为NSArray或者NSDictionary</h3><pre class="prettyprint linenums">#import "NSString+JSONCategories.h"
三、将JSON串与NSArray和NSDictionary的操作进行封装</h2><p><span style="line-height:1.5;">当然,也有很多时候,我们将这些操作,分别定义在NSObject和NSString的一个分类中</span></p><p>
直接贴:</p>
<h3>1.将NSString转化为NSArray或者NSDictionary</h3><pre class="prettyprint linenums">#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<br/>
#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);
打印的结果
五、参考文章
版权属于:胡东东博客
本文链接:https://blog.hudongdong.com/oc/226.html
自2017年12月26日起,『转载以及大段采集进行后续编辑』须注明本文标题和链接!否则禁止所有转载和采集行为!
☟☟如文章有用,可点击一次下方广告支持一下☟☟