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 相关文章推荐
DedeCms模板安装/制作概述
Mar 11 PHP
php 删除无限级目录与文件代码共享
Nov 22 PHP
获取php页面执行时间,数据库读写次数,函数调用次数等(THINKphp)
Jun 03 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
深入理解PHP之OpCode原理详解
Jun 01 PHP
PHP常用函数总结(180多个)
Dec 25 PHP
Ubuntu 16.04下安装PHP 7过程详解
Mar 28 PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 PHP
Laravel5.4框架中视图共享数据的方法详解
Sep 05 PHP
php项目中类的自动加载实例讲解
Sep 12 PHP
YII2框架中日志的配置与使用方法实例分析
Mar 18 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
Nov 22 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 中的输出缓冲
2006/12/21 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
php判断文件夹是否存在不存在则创建
2015/04/09 PHP
php准确计算复活节日期的方法
2015/04/18 PHP
PHP获取某个月最大天数(最后一天)的方法
2015/07/29 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
YII Framework框架教程之安全方案详解
2016/03/14 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
php-fpm添加service服务的例子
2018/04/27 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
JavaScript中innerHTML,innerText,outerHTML的用法及区别
2015/09/01 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
js实现div色块碰撞
2020/01/16 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
Vue中引入svg图标的两种方式
2021/01/14 Vue.js
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
[01:15:15]VG VS EG Supermajor小组赛B组胜者组第一轮 BO3第二场 6.2
2018/06/03 DOTA
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
Python中装饰器高级用法详解
2017/12/25 Python
在Python中字符串、列表、元组、字典之间的相互转换
2019/11/15 Python
python批量合成bilibili的m4s缓存文件为MP4格式 ver2.5
2020/12/01 Python
联想C++笔试题
2012/06/13 面试题
岗位职责范本
2013/11/23 职场文书
仰望星空观后感
2015/06/10 职场文书
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
Java 异步任务计算FutureTask
2022/04/28 Java/Android
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python