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. GameUnity 2.0 文档(一) 事件机制

    新版本和旧版本一样,有socket事件和内部事件.区别在于,你只要一个监听就可以 消息协议规则: 用类名标记协议的好处是什么? 是利用反射机制来处理每个消息. 程序启动的时候,会读取所有类名,并字典保 ...

  2. ubuntu下安装多个jdk的切换命令update-alternatives

    update-alternatives  以前叫alternatives 下面的介绍,直接引用了,其中必须安装了才会在候选里面出现. usage: update-alternatives --inst ...

  3. java 接口与实现

    Computable.java public interface Computable { int MAX = 46; int f(int x); } China.java public class ...

  4. UVALive 4031 Integer Transmission(贪心 + DP)

    分析:求出最大值和最小值比较简单,使用贪心法,求最小值的时候我们让所有的0尽可能的向后延迟就可以了,求最大值则相反. 关键在于求出可以组合出的数字个数. 这就是组合数学版的dp了,我们让dp[i][j ...

  5. UVALive 2324 Human Gene Functions(动态规划)

    题意:求出将两个字符串改成一样长度所能形成最大的相似度. 思路:这个可以说是编辑距离的一个变形,编辑距离最终状态时要两个字符串完全一致,这个就是要求长度一样,而且这个只允许插入“—”这一个字符.模仿编 ...

  6. apache.commoms.digester3 解析xml文件

    Technorati 标签: java,xml,digester,xmlrule,FromXmlRulesModule 1 简介 java解析xml,就个人所知有3种方法DOM.SAX和Digeste ...

  7. android:editable is deprecated: Use an <EditText> to make it editable

    问题:android:editable is deprecated: Use an to make it editable   意思:Android的:编辑是反对:使用<</span> ...

  8. CodeForces 190D Non-Secret Cypher

    双指针. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> ...

  9. PHP中require()文件包含的正确用法

    以前看一些PHP框架源码的时候,很奇怪在文件包含的时候,会用dirname(__FILE__)来拼凑文件路 径,不知道这样做有什么好处,后来终于发现了其中的缘由. 我们来看一个简单的例子: 有a,b, ...

  10. jq的遍历节点

    1.child()方法 该方法用于取得匹配元素的子元素集合 2.next() 该方法用于取得匹配元素后面紧邻的同辈元素, 3.prev() 该方法用于取得匹配元素前面紧邻的同辈元素 4.sibling ...