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

最新文章

  1. DX系列之TreeList
  2. 深入理解DOM节点类型第一篇——12种DOM节点类型概述
  3. spring入门教程——笔记
  4. spring mvc 初始化错误
  5. 第11章 Windows线程池(2)_Win2008及以上的新线程池
  6. zedboard OPENCV移植
  7. android Spinner的使用
  8. (转)asp.net实现忘记密码找回的代码
  9. 纯CSS3实现自定义涂鸦风格的边框
  10. [Swust OJ 649]--NBA Finals(dp,后台略(hen)坑)
  11. 使用Charles Proxy提升iOS开发效率
  12. java开发网易电话面试 一面总结
  13. JavaScript系列----一切皆是对象
  14. HDU5131-Song Jiang&#39;s rank list HDU5135-Little Zu Chongzhi&#39;s Triangles(大佬写的)
  15. Jmeter MD5插件
  16. Android平台如何获得屏幕尺寸?
  17. 深入理解Plasma(一)Plasma 框架
  18. Jmeter测试报告
  19. Python自动化开发 - 常用模块(二)
  20. 一年内自学MIT的33门课? 疯狂学习有方法

热门文章

  1. Java Concurrent Topics
  2. iOS 开发者应该知道的 ARM 结构
  3. elasticsearch使用jetty进行简单的权限控制
  4. html dom模型一
  5. USACO Section 1.4 Arithmetic Progressions 解题报告
  6. js zhi网马
  7. Android --- 读取系统资源函数getResources()小结
  8. STM32中断触发
  9. Android media媒体库分析之:MediaProvider
  10. 认识ExtJS(04)--常见Web框架的ExtJS改造