欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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也应该这样做。

如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!