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脚本的10个技巧(1)
Oct 09 PHP
php图片验证码代码
Mar 27 PHP
Smarty安装配置方法
Apr 10 PHP
PHP __autoload()方法真的影响性能吗?
Mar 30 PHP
php数组声明、遍历、数组全局变量使用小结
Jun 05 PHP
qq登录,新浪微博登录接口申请过程中遇到的问题
Jul 22 PHP
PHP下载远程文件到本地存储的方法
Mar 24 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
利用PHP判断文件是否为图片的方法总结
Jan 06 PHP
php分页查询mysql结果的base64处理方法示例
May 18 PHP
分析php://output和php://stdout的区别
May 06 PHP
PHP连续签到功能实现方法详解
Dec 04 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 strtotime函数用法、实现原理和源码分析
2015/02/04 PHP
php实现将数组转换为XML的方法
2015/03/09 PHP
php实现插入排序
2015/03/29 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
PHP利用二叉堆实现TopK-算法的方法详解
2017/04/24 PHP
PHP基于mcript扩展实现对称加密功能示例
2019/02/21 PHP
PHP7使用ODBC连接SQL Server2008 R2数据库示例【基于thinkPHP5.1框架】
2019/05/06 PHP
用jquery存取照片的具体实现方法
2013/06/30 Javascript
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
js实现二代身份证号码验证详解
2014/11/20 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
Vue 将后台传过来的带html字段的字符串转换为 HTML
2018/03/29 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
详解如何在Node.js的httpServer中接收前端发送的arraybuffer数据
2018/11/11 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
vue远程加载sfc组件思路详解
2019/12/25 Javascript
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
python和shell变量互相传递的几种方法
2013/11/20 Python
Python正则表达式和元字符详解
2018/11/29 Python
python多项式拟合之np.polyfit 和 np.polyld详解
2020/02/18 Python
python为QT程序添加图标的方法详解
2020/03/09 Python
Django 权限管理(permissions)与用户组(group)详解
2020/11/30 Python
同学聚会欢迎辞
2014/01/14 职场文书
求职信模板怎么做
2014/01/26 职场文书
小学优秀教育工作者事迹材料
2014/05/09 职场文书
公开承诺书格式
2014/05/21 职场文书
户籍证明格式
2014/09/15 职场文书
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android