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 相关文章推荐
PHP+DBM的同学录程序(2)
Oct 09 PHP
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
PHP stripos()函数及注意事项的分析
Jun 08 PHP
新浪SAE云平台下使用codeigniter的数据库配置
Jun 12 PHP
php 问卷调查结果统计
Oct 08 PHP
php实现图片上传并进行替换操作
Mar 15 PHP
php 时间time与日期date之间的使用详解及区别
Nov 07 PHP
Yii2 批量插入、更新数据实例
Mar 15 PHP
php5.x禁用eval的操作方法
Oct 19 PHP
PHP PDO数据库操作预处理与注意事项
Mar 16 PHP
PHP Swoole异步读取、写入文件操作示例
Oct 24 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
Jul 13 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写的MySQL数据库用户认证系统代码
2007/03/22 PHP
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
php cout<<的一点看法
2010/01/24 PHP
php检查页面是否被百度收录
2015/10/28 PHP
CodeIgniter自定义控制器MY_Controller用法分析
2016/01/20 PHP
PHP命名空间与自动加载机制的基础介绍
2019/08/25 PHP
JS去除字符串的空格增强版(可以去除中间的空格)
2009/08/26 Javascript
jquery 关于event.target使用的几点说明介绍
2013/04/26 Javascript
Iframe实现跨浏览器自适应高度解决方法
2014/09/02 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
jQuery简单实现两级下拉菜单效果代码
2015/09/15 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
Ionic + Angular.js实现图片轮播的方法示例
2017/05/21 Javascript
jquery append与appendTo方法比较
2017/05/24 jQuery
Angularjs为ng-click事件传递参数
2017/06/15 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
webpack4.x打包过程详解
2018/07/18 Javascript
JavaScript实现简单随机点名器
2019/11/21 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
vue 使用 canvas 实现手写电子签名
2020/03/06 Javascript
详解Howler.js Web音频播放终极解决方案
2020/08/23 Javascript
Python字符串特性及常用字符串方法的简单笔记
2016/01/04 Python
python线程、进程和协程详解
2016/07/19 Python
python实现人脸识别经典算法(一) 特征脸法
2018/03/13 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
2018/05/10 Python
Python logging模块异步线程写日志实现过程解析
2020/06/30 Python
c/c++某大公司的两道笔试题
2014/02/02 面试题
测绘工程个人的自我评价
2013/11/23 职场文书
银行实习生的自我评价
2013/12/09 职场文书
经济贸易系求职信
2014/08/04 职场文书
2014年党的群众路线整改措施思想汇报
2014/10/12 职场文书
孔繁森观后感
2015/06/10 职场文书
浅谈Python 中的复数问题
2021/05/19 Python
使用jpa之动态插入与修改(重写save)
2021/11/23 Java/Android