JSON数据与NSString、NSDictionary和NSArray之间的转化

在iOS  5 中,苹果引入了一个解析JSON串的NSJSONSerialization类。通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化。
以前,我记得我用的是第三方的插件。但是,苹果出了这套解析后,效率也大大了超过了,所有的解析第三方类库。所以,推荐使用NSJSONSerialization类来完成转化。

291948064614139.png

一、将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);

打印的结果

屏幕快照 2016-11-18 上午10.48.52.png

五、参考文章

Last modification:January 1st, 1970 at 08:00 am
如果看了这个文章可以让你少加会班,可以请我喝杯可乐
已打赏名单
微信公众号

Leave a Comment