IOS 开发之NSDictionary转换成JSON字符串
程序员文章站
2024-03-12 08:59:50
ios 开发之nsdictionary转换成json字符串
普通情况下,你可能会用一个nsdictionary的分类去做nsdictionary转json,如下代码:...
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也应该这样做。
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!