当前位置: 移动技术网 > IT编程>开发语言>PHP > IOS 开发之NSDictionary转换成JSON字符串

IOS 开发之NSDictionary转换成JSON字符串

2017年12月12日  | 移动技术网IT编程  | 我要评论

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网