IOS 开发之NSDictionary转换成JSON字符串
IOS开发之NSDictionary转换成JSON字符串
普通情况下,你可能会用一个NSDictionary的分类去做NSDictionary转JSON,如下代码:
NSError*error;
NSData*jsonData=[NSJSONSerializationdataWithJSONObject:selfoptions:NSJSONWritingPrettyPrintederror:&error];
if(!jsonData){
return@"{}";
}else{
return[[NSStringalloc]initWithData:jsonDataencoding:NSUTF8StringEncoding];
}
然而,NSDictionary装的数据类型鱼龙混杂,有可能是NSDate,NSNumber,NSValue等Objective-C对象,而[NSJSONSerializationdataWithJSONObject:options:error:]这个方法是不能解析这些对象的,如果有这些对象,则会导致crash。所以我们应该在调用NSJSONSerialization之前加一步,将所有数据处理成NSString,代码如下:
NSError*error=nil;
NSData*jsonData=nil;
if(!self){
returnnil;
}
NSMutableDictionary*dict=[NSMutableDictionarydictionary];
[selfenumerateKeysAndObjectsUsingBlock:^(id_Nonnullkey,id_Nonnullobj,BOOL*_Nonnullstop){
NSString*keyString=nil;
NSString*valueString=nil;
if([keyisKindOfClass:[NSStringclass]]){
keyString=key;
}else{
keyString=[NSStringstringWithFormat:@"%@",key];
}
if([objisKindOfClass:[NSStringclass]]){
valueString=obj;
}else{
valueString=[NSStringstringWithFormat:@"%@",obj];
}
[dictsetObject:valueStringforKey:keyString];
}];
jsonData=[NSJSONSerializationdataWithJSONObject:dictoptions:NSJSONWritingPrettyPrintederror:&error];
if([jsonDatalength]==0||error!=nil){
returnnil;
}
NSString*jsonString=[[NSStringalloc]initWithData:jsonDataencoding:NSUTF8StringEncoding];
returnjsonString;
这样就NSDictionary转JSON就不会crash了,同理,NSArray也应该这样做。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!