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也应该这样做。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!