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将任何格式视频转为flv的代码
Sep 03 PHP
利用php获取服务器时间的实现代码
Jun 07 PHP
CodeIgniter CLI模式简介
Jun 17 PHP
php中将一段数据存到一个txt文件中并显示其内容
Aug 15 PHP
PHP图片加水印实现方法
May 06 PHP
理解php依赖注入和控制反转
May 11 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 PHP
PHP filesize函数用法浅析
Feb 15 PHP
实例讲解PHP表单验证功能
Feb 15 PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 PHP
PHP 实现 JSON 数据的编码和解码操作详解
Apr 22 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
May 02 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
DOTA2 6.87版本后新眼位详解攻略
2020/04/20 DOTA
默默简单的写了一个模板引擎
2007/01/02 PHP
PHP面向对象分析设计的61条军规小结
2010/07/17 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
php和nginx交互实例讲解
2019/09/24 PHP
jQuery方法简洁实现隔行换色及toggleClass的使用
2013/03/15 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
chrome下img加载对height()的影响示例探讨
2014/05/26 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
分享12个非常实用的JavaScript小技巧
2016/05/11 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
vscode vue 文件模板的配置方法
2019/07/23 Javascript
vue-video-player 断点续播的实现
2021/02/01 Vue.js
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
flask中的wtforms使用方法
2018/07/21 Python
python pandas消除空值和空格以及 Nan数据替换方法
2018/10/30 Python
pandas dataframe的合并实现(append, merge, concat)
2019/06/24 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
html5 拖拽及用 js 实现拖拽功能的示例代码
2020/10/23 HTML / CSS
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
禁毒宣传工作方案
2014/05/23 职场文书
计算机专业求职信
2014/06/02 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
运动会广播稿200字
2014/10/18 职场文书
计算机专业自荐信
2015/03/05 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
聚会通知怎么写
2015/04/23 职场文书
2015年中学总务处工作总结
2015/07/22 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
2015年街道办事处团委工作总结
2015/10/14 职场文书
Win11怎么解除儿童账号限制?Win11解除微软儿童账号限制方法
2022/07/07 数码科技