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 相关文章推荐
模拟xcopy的函数
Oct 09 PHP
PHP中HTTP方式下的Gzip压缩传输方法举偶
Feb 15 PHP
比较时间段一与时间段二是否有交集的php函数
May 31 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
Jul 12 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
PHP原生函数一定好吗?
Dec 08 PHP
php创建无限级树型菜单
Nov 05 PHP
PHP实现数组array转换成xml的方法
Jul 19 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
YII框架行为behaviors用法示例
Apr 26 PHP
php多进程并发编程防止出现僵尸进程的方法分析
Feb 28 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
咖啡语言
2021/03/03 咖啡文化
ThinkPHP访问不存在的模块跳转到404页面的方法
2014/06/19 PHP
验证坐标在某坐标区域内php代码
2016/10/08 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
jQuery中:empty选择器用法实例
2014/12/30 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
2017/10/11 Javascript
使用 Node.js 模拟滑动拼图验证码操作的示例代码
2017/11/02 Javascript
js中获取URL参数的共用方法getRequest()方法实例详解
2018/10/24 Javascript
JS复杂判断的更优雅写法代码详解
2018/11/07 Javascript
nodemon实现Typescript项目热更新的示例代码
2019/11/19 Javascript
JS实现联想、自动补齐国家或地区名称的功能
2020/07/07 Javascript
JQuery通过键盘控制键盘按下与松开触发事件
2020/08/07 jQuery
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
Python学习之用pygal画世界地图实例
2017/12/07 Python
python线程池threadpool实现篇
2018/04/27 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
python实现播放音频和录音功能示例代码
2018/12/30 Python
详解python的argpare和click模块小结
2019/03/31 Python
python买卖股票的最佳时机(基于贪心/蛮力算法)
2019/07/05 Python
python 解决print数组/矩阵无法完整输出的问题
2020/02/19 Python
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
现代化办公人员工作的自我评价
2013/10/16 职场文书
班级文化标语
2014/06/23 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
会议主持词开场白
2015/05/28 职场文书
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技