iOS NSJSONSerialization 实现JSON 序列化

简述
iOS 5 中,苹果引入了一个解析JSON串的NSJSONSerialization类。
通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化。不需要另外使用第三方库。

一、NSDictionary或NSArray转化为JSON串

// 将字典或者数组转化为JSON串
- (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;
    }

    //使用这个方法的返回,我们就可以得到想要的JSON串
    NSString *jsonString = [[NSString alloc] initWithData:jsonData
                                                 encoding:NSUTF8StringEncoding];
}

序列化函数的说明
先看这段代码

/* Generate JSON data from a Foundation object. If the object will not produce valid JSON then an exception will be thrown. Setting the NSJSONWritingPrettyPrinted option will generate JSON with whitespace designed to make the output more readable. If that option is not set, the most compact possible JSON will be generated. If an error occurs, the error parameter will be set and the return value will be nil. The resulting data is a encoded in UTF-8.*/
+(nullable NSData *)dataWithJSONObject:(id)obj options:(NSJSONWritingOptions)opt error:(NSError **)error;

此方法在Objective-C中用来从对象生成JSON,其中类型NSJSONWritingOptions苹果描述为”Options for writing JSON data.”,官方的说明是设置NSJSONWritingOptions 会提高阅读性,不设置的话就会得到我们想要的格式,但是我们看到这里,只有一个枚举:

typedef NS_OPTIONS(NSUInteger, NSJSONWritingOptions) {
    NSJSONWritingPrettyPrinted = (1UL << 0)
} NS_ENUM_AVAILABLE(10_7, 5_0);

二、JSON串转化为NSDictionary或NSArray

//将NSString转化为NSData
[jsonString dataUsingEncoding:NSASCIIStringEncoding];

// 将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" // ------ 其实可以不用category
@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

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

转载为了保存以后做笔记用:

作者:黑羽肃霜
链接:https://www.jianshu.com/p/166462f865bb
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。