ios 开发之nsdictionary转换成json字符串
普通情况下,你可能会用一个nsdictionary的分类去做nsdictionary转json,如下代码:
nserror *error;
nsdata *jsondata = [nsjsonserialization datawithjsonobject:self options:nsjsonwritingprettyprinted error:&error];
if (! jsondata) {
return @"{}";
} else {
return [[nsstring alloc] initwithdata:jsondata encoding:nsutf8stringencoding];
}
然而,nsdictionary装的数据类型鱼龙混杂,有可能是nsdate,nsnumber,nsvalue等objective-c对象,而[nsjsonserialization datawithjsonobject:options:error:]这个方法是不能解析这些对象的,如果有这些对象,则会导致crash。所以我们应该在调用nsjsonserialization之前加一步,将所有数据处理成nsstring,代码如下:
nserror *error = nil;
nsdata *jsondata = nil;
if (!self) {
return nil;
}
nsmutabledictionary *dict = [nsmutabledictionary dictionary];
[self enumeratekeysandobjectsusingblock:^(id _nonnull key, id _nonnull obj, bool * _nonnull stop) {
nsstring *keystring = nil;
nsstring *valuestring = nil;
if ([key iskindofclass:[nsstring class]]) {
keystring = key;
}else{
keystring = [nsstring stringwithformat:@"%@",key];
}
if ([obj iskindofclass:[nsstring class]]) {
valuestring = obj;
}else{
valuestring = [nsstring stringwithformat:@"%@",obj];
}
[dict setobject:valuestring forkey:keystring];
}];
jsondata = [nsjsonserialization datawithjsonobject:dict options:nsjsonwritingprettyprinted error:&error];
if ([jsondata length] == 0 || error != nil) {
return nil;
}
nsstring *jsonstring = [[nsstring alloc] initwithdata:jsondata encoding:nsutf8stringencoding];
return jsonstring;
这样就nsdictionary转json就不会crash了,同理,nsarray也应该这样做。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!