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输出控制功能在简繁体转换中的应用
Oct 09 PHP
PHP+javascript液晶时钟
Oct 09 PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 PHP
PHP超级全局变量数组小结
Oct 04 PHP
php简单获取文件扩展名的方法
Mar 24 PHP
Laravel 5框架学习之表单
Apr 08 PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 PHP
中高级PHP程序员应该掌握哪些技术?
Sep 23 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
May 20 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
PHP实现的折半查询算法示例
Oct 09 PHP
PHP实现的curl批量请求操作示例
Jun 06 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
日本十大科幻动漫 宇宙骑士垫底,第一已成经典
2020/03/04 日漫
PHP获取MAC地址的函数代码
2011/09/11 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
全面解读PHP的Yii框架中的日志功能
2016/03/17 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
Yii框架常见缓存应用实例小结
2019/09/09 PHP
js传值 判断
2006/10/26 Javascript
WEB 浏览器兼容 推荐收藏
2010/05/14 Javascript
基于JQuery的浮动DIV显示提示信息并自动隐藏
2011/02/11 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
NODE.JS加密模块CRYPTO常用方法介绍
2014/06/05 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
vue做网页开场视频的实例代码
2017/10/20 Javascript
详解从NodeJS搭建中间层再谈前后端分离
2018/11/13 NodeJs
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
ESLint 是如何检查 .vue 文件的
2020/11/30 Vue.js
[05:31]DOTA2上海特级锦标赛主赛事第三日RECAP
2016/03/05 DOTA
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
python xlsxwriter库生成图表的应用示例
2018/03/16 Python
python如何拆分含有多种分隔符的字符串
2018/03/20 Python
深入浅析Python 中 is 语法带来的误解
2019/05/07 Python
Python 3.8中实现functools.cached_property功能
2019/05/29 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
Python3.x+pyqtgraph实现数据可视化教程
2020/03/14 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
python怎么调用自己的函数
2020/07/01 Python
Python classmethod装饰器原理及用法解析
2020/10/17 Python
编写python代码实现简单抽奖器
2020/10/20 Python
去除python中的字符串空格的简单方法
2020/12/22 Python
Ibatis如何使用动态表名
2015/07/12 面试题
公司演讲稿开场白
2014/08/25 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书