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


Posted in PHP onAugust 14, 2017

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

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

PHP 相关文章推荐
JAVA/JSP学习系列之六
Oct 09 PHP
php eval函数用法 PHP中eval()函数小技巧
Oct 31 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
php中OR与|| AND与&&的区别总结
Oct 26 PHP
模板引擎smarty工作原理以及使用示例
May 25 PHP
php访问数组最后一个元素的函数end()用法
Mar 18 PHP
php实现用于验证所有类型的信用卡类
Mar 24 PHP
ThinkPHP框架里隐藏index.php
Apr 12 PHP
PHP中使用foreach()遍历二维数组的简单实例
Jun 13 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
php微信公众号开发之秒杀
Oct 20 PHP
PHP二维数组分页2种实现方法解析
Jul 09 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
Aug 14 #PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 #PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 #PHP
Laravel5.5新特性之友好报错以及展示详解
Aug 13 #PHP
php数据序列化测试实例详解
Aug 12 #PHP
PHP新特性之字节码缓存和内置服务器
Aug 11 #PHP
PHP基于MySQLI函数封装的数据库连接工具类【定义与用法】
Aug 11 #PHP
You might like
PHP 循环列出目录内容的函数代码
2010/05/26 PHP
php switch语句多个值匹配同一代码块的实现
2014/03/03 PHP
php实现使用正则将文本中的网址转换成链接标签
2014/12/03 PHP
php实现Mysql简易操作类
2015/10/11 PHP
php实现异步数据调用的方法
2015/12/24 PHP
jtable列中自定义button示例代码
2013/11/21 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
2013/12/05 Javascript
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
理解Javascript图片预加载
2016/02/23 Javascript
jQuery实现的鼠标经过时变宽的效果(附demo源码)
2016/04/28 Javascript
JavaScript Promise 用法
2016/06/14 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
利用JavaScript的Map提升性能的方法详解
2019/08/14 Javascript
Vue.js组件通信之自定义事件详解
2019/10/19 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
一个超级简单的python web程序
2014/09/11 Python
python使用wxpython开发简单记事本的方法
2015/05/20 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
python登录WeChat 实现自动回复实例详解
2019/05/28 Python
linux下python中文乱码解决方案详解
2019/08/28 Python
opencv之为图像添加边界的方法示例
2019/12/26 Python
基于Tensorflow:CPU性能分析
2020/02/10 Python
pytorch cuda上tensor的定义 以及减少cpu的操作详解
2020/06/23 Python
python中操作文件的模块的方法总结
2021/02/04 Python
蛋白质世界:Protein World
2017/11/23 全球购物
德国旅行、体验和活动的预订平台:Watado
2019/12/04 全球购物
缓刑人员的思想汇报
2014/01/11 职场文书
公司中秋节活动方案
2014/02/12 职场文书
2014年大班元旦活动方案
2014/02/26 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
法人身份证明书
2015/06/18 职场文书
2016年第十九届推普周活动总结
2016/04/06 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
分享CSS盒子模型隐藏的几种方式
2022/02/28 HTML / CSS