http://blog.csdn.net/worldzhy/article/details/49982491

将NSArray、NSDictionary转换为JSON格式进行网络传输,是经常用到的,但是iOS没有提供方便的方法库。我们模拟一个实例,假设我们需要把一个自定义的一个模型(只有若干属性的Class)的数组转为一个JSON字符串,作为后端需要的一个参数传给后端,下面给出了实现方法:

  1. //HSPictureModel数组转为json
  2. - (NSString *)pictureArrayToJSON:(NSArray *)picArr {
  3. if (picArr && picArr.count > 0) {
  4. NSMutableArray *arr = [NSMutableArray arrayWithCapacity:0];
  5. for (HSPictureModel *model in picArr) {
  6. NSData *jsonData = [Object2Json getJSON:model options:NSJSONWritingPrettyPrinted error:nil];
  7. NSString *jsonText = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  8. [arr addObject:jsonText];
  9. }
  10. return [self objArrayToJSON:arr];
  11. }
  12. return nil;
  13. }
  14. 上方这个方法<span style="font-size:18px;">第一步,将一个model转换为JSON字符串,然后将数组中的这些字符串拼接起来,得到最终的JSON字符串。实现了我们的目的。其中用到的Object2Json的代码附在文章最下面。
  15. </span>
  16. //把多个json字符串转为一个json字符串
  17. - (NSString *)objArrayToJSON:(NSArray *)array {
  18. NSString *jsonStr = @"[";
  19. for (NSInteger i = 0; i < array.count; ++i) {
  20. if (i != 0) {
  21. jsonStr = [jsonStr stringByAppendingString:@","];
  22. }
  23. jsonStr = [jsonStr stringByAppendingString:array[i]];
  24. }
  25. jsonStr = [jsonStr stringByAppendingString:@"]"];
  26. return jsonStr;
  27. }

以上,我们实现了数据从客户端传到后台时可能需要的转换,下面再看一下,如何把后台传过来的JSON形式的字符串,解析为客户端认识的NSArray或者NSDictionary。

  1. //json字符串转为数组
  2. - (NSArray *)stringToJSON:(NSString *)jsonStr {
  3. if (jsonStr) {
  4. id tmp = [NSJSONSerialization JSONObjectWithData:[jsonStr dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments | NSJSONReadingMutableLeaves | NSJSONReadingMutableContainers error:nil];
  5. if (tmp) {
  6. if ([tmp isKindOfClass:[NSArray class]]) {
  7. return tmp;
  8. } else if([tmp isKindOfClass:[NSString class]]
  9. || [tmp isKindOfClass:[NSDictionary class]]) {
  10. return [NSArray arrayWithObject:tmp];
  11. } else {
  12. return nil;
  13. }
  14. } else {
  15. return nil;
  16. }
  17. } else {
  18. return nil;
  19. }
  20. }

这个独立的方法可以实现后端JSON字符串转为NSArray或NSDictionary的功能。

最后,附上Object2Json类的实现,该实现摘抄自网络。

    1. #import "Object2Json.h"
    2. #import <objc/runtime.h>
    3. @implementation Object2Json
    4. + (NSDictionary*)getObjectData:(id)obj
    5. {
    6. NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    7. unsigned int propsCount;
    8. objc_property_t *props = class_copyPropertyList([obj class], &propsCount);
    9. for(int i = 0;i < propsCount; i++)
    10. {
    11. objc_property_t prop = props[i];
    12. NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];
    13. id value = [obj valueForKey:propName];
    14. if(value == nil)
    15. {
    16. value = [NSNull null];
    17. }
    18. else
    19. {
    20. value = [self getObjectInternal:value];
    21. }
    22. [dic setObject:value forKey:propName];
    23. }
    24. return dic;
    25. }
    26. + (NSData*)getJSON:(id)obj options:(NSJSONWritingOptions)options error:(NSError**)error
    27. {
    28. return [NSJSONSerialization dataWithJSONObject:[self getObjectData:obj] options:options error:error];
    29. }
    30. + (id)getObjectInternal:(id)obj
    31. {
    32. if([obj isKindOfClass:[NSString class]]
    33. || [obj isKindOfClass:[NSNumber class]]
    34. || [obj isKindOfClass:[NSNull class]])
    35. {
    36. return obj;
    37. }
    38. if([obj isKindOfClass:[NSArray class]])
    39. {
    40. NSArray *objarr = obj;
    41. NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count];
    42. for(int i = 0;i < objarr.count; i++)
    43. {
    44. [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i];
    45. }
    46. return arr;
    47. }
    48. if([obj isKindOfClass:[NSDictionary class]])
    49. {
    50. NSDictionary *objdic = obj;
    51. NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]];
    52. for(NSString *key in objdic.allKeys)
    53. {
    54. [dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];
    55. }
    56. return dic;
    57. }
    58. return [self getObjectData:obj];
    59. }
    60. @end

iOS 将NSArray、NSDictionary转换为JSON格式进行网络传输的更多相关文章

  1. javascript 中的JSON.stringify - 将对象和数组转换为json格式(来源于网络)

          JSON.stringify 函数 (JavaScript) 将 JavaScript 值转换为 JavaScript 对象表示法 (Json) 字符串.     JSON.stringi ...

  2. 数据转换为json格式的方法

    数据转换为json格式: 如果一张表中存在主外键关系,模板自动生成的类是不可以转换成JSON格式的,此时需要重新写一个类,类前面需加[DataContract],字段前需加[DataMember],实 ...

  3. 后台list 如何转换为json格式

    request.setCharacterEncoding("utf-8"); response.setCharacterEncoding( "UTF-8"); ...

  4. JSon_零基础_005_将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面

    将po(bean)对象集合List转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写:po(bean)代码: package com.west.webcourse.po; /** * 第 ...

  5. JSon_零基础_005_将po(bean)对象转换为JSon格式的对象字符串,返回给界面

    将po(bean)对象转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写po(bean)类: package com.west.webcourse.po; /** * 第01步:编写be ...

  6. JSon_零基础_004_将Set集合对象转换为JSon格式的对象字符串,返回给界面

    将Set集合对象转换为JSon格式的对象字符串,返回给界面 需要导入的jar包: 编写:servlet: package com.west.webcourse.servlet; import java ...

  7. JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面

    将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...

  8. JSon_零基础_002_将List类型数组转换为JSon格式的对象字符串,返回给界面

    将List类型数组转换为JSon格式的对象字符串,返回给界面 所需要导入的包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * ...

  9. JSon_零基础_001_将布尔类型数组转换为JSon格式字符串,返回给界面

    将布尔类型数组转换为JSon格式字符串,返回给界面 需要导入包: 编写bean: package com.west.webcourse.po; /** * 第01步:编写bean类, * 下一步com ...

随机推荐

  1. runtime基础

    前言 学习Objective-C的运行时Runtime系统是很有必要的.个人觉得,得之可得天下,失之则失天下. Objective-C提供了编译运行时,只要有可能,它都可以动态地运作.这意味着不仅需要 ...

  2. php 四种基础算法 ---- 快速排序法

    4.快速排序法 代码: function quick_sort($arr) {    //先判断是否需要继续进行    $length = count($arr);    if($length < ...

  3. - (void)addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key; 方法浅析

    转载自:http://blog.csdn.net/ronaldo_carry/article/details/49070119 将viewdidload里面的代码全部注释掉 - (void)viewD ...

  4. gulp相关知识(1)

    这是一种简单的工具,非常容易上手而且功能也是多种多样. 例如将整个网站打包下来的时候,看到的js代码总是混乱的,这就是类似于gulp的工具进行了加密,其他的功能还有很多这里就不赘述了. 首先是gulp ...

  5. UVALive 4992 Jungle Outpost(半平面交)

    题意:给你n个塔(点)形成一个顺时针的凸包,敌人可以摧毁任何塔,摧毁后剩下的塔再组成凸包 在开始的凸包内选一点为主塔,保证敌人摧毁尽量多塔时主塔都还在现在的凸包内,求出最多摧毁的塔 题解:这题关键就是 ...

  6. STM32F2系列低功耗总结

    序号 运行状态 进入指令(stm32f2xx_pwr.c) 退出条件 状态 IO管脚状态 进一步降低功耗的措施 1 运行模式 上电/系统复位后的默认模式, HCLK驱动CPU运行代码 可通过指令 进入 ...

  7. java工程开发之图形化界面之(第四课)

    本节中,我们将创建一个小应用程序,它使用循环生成其图案.我们将使用if语句和setColor方法.同时我们将介绍drawString方法,并使用它在小应用程序窗口中写出文本. 下面的小应用程序是显示一 ...

  8. compileSdkVersion,buildToolsVersion还有targetSdkVersion要一致,从而避免build的时候报错

    Android Studio里的app的build.gradle文件: android { compileSdkVersion 24 buildToolsVersion "24.0.0&qu ...

  9. JSP直接调用一个action定向到页面

    方法:写function <script type="text/javascript"> function mainPas(){ window.location.hre ...

  10. 鉴客 C# 抓取页面(带认证)

    1. [代码][C#]代码     01 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(""); 02 re ...