在处理网络请求时,我们需要在String,NSData,Array,Dictionary之间转换,比如把一个字典转换为一个字符串作为某个字段的值,以及最为常见的把请求到到NSData类型的数据转换为字典或数组。
有一些第三方库已经帮我们完成了这些工作,比如Objective写的JSONKit和Swift写的SwiftJSON等。
实际上我们可以用系统原生的NSJSONSerialization类和字符串的便捷初始化方法实现这些转化。而且这样转化比第三方的效率高。
我们可以封装几个可爱的函数(下边函数的JSON主要指的是字典、数组等):
1.Objective-C:
+ (NSData *)dataWithJSON:(id)object {
return object ? [NSJSONSerializationdataWithJSONObject:object options:0error:nil] :nil;
}
+ (id)JSONWithData:(NSData *)data {
return data ? [NSJSONSerializationJSONObjectWithData:data options:0error:nil] :nil;
}
+ (id)mutableJSONWithData:(NSData *)data {
return data ? [NSJSONSerializationJSONObjectWithData:data options:NSJSONReadingMutableContainerserror:nil] :nil;
}
+ (NSString *)stringWithData:(NSData *)data {
return data ? [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding] :nil;
}
+ (NSData *)dataWithString:(NSString *)string {
return string ? [stringdataUsingEncoding:NSUTF8StringEncoding] :nil;
}
+ (id)JSONWithString:(NSString *)string {
NSData *data = [selfdataWithString:string];
return [selfJSONWithData:data];
}
+ (NSString *)stringWithJSON:(id)object {
NSData *data = [selfdataWithJSON:object];
return [selfstringWithData:data];
}
2.Swift
func dataWithJSON(object:AnyObject?) ->NSData? {
iflet object = object {
do {
let data =try NSJSONSerialization.dataWithJSONObject(object, options:NSJSONWritingOptions())
return data
} catch {
dLog("parse JSONObject -> NSData failed")
}
}
returnnil
}
func JSONWithData(data:NSData?) ->AnyObject? {
iflet data = data {
do {
let object =try NSJSONSerialization.JSONObjectWithData(data, options: .AllowFragments)
return object
} catch {
dLog("parse NSData -> JSONObject failed")
}
}
returnnil
}
func stringWithData(data:NSData?) ->String? {
iflet data = data {
returnString(data: data, encoding: NSUTF8StringEncoding)
}
returnnil
}
func dataWithString(string:String?) ->NSData? {
iflet string = string {
return string.dataUsingEncoding(NSUTF8StringEncoding)
}
returnnil
}
func JSONWithString(string:String?) ->AnyObject? {
let data =dataWithString(string)
returnJSONWithData(data)
}
func stringWithJSON(object:AnyObject?) ->String? {
let data =dataWithJSON(object)
returnstringWithData(data)
}
这些工具方法我已经写到了iOS新工程准备工作集里了,可以在下边网址看到:
Objective-C
Swift