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. Servlet事件监听器

    监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法将立即被执行. 面试题:请描述一下java事件监听机 ...

  2. gradle 构建spring源码时候报错

    这是使用jdk1.7报的错,我卸载1.7后使用1.8 ,就可以了

  3. java String不可变对象,但StringBuffer是可变对象

    什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不 ...

  4. js html 交互监听事件学习

    事件处理程序(handler): HTML事件处理程序: <input type="button" value="Click Here" onclick= ...

  5. Chapter 1 First Sight——17

    Once I got around the cafeteria, building three was easy to spot. 我一走出自助餐厅,很容易看见建筑三. A large black & ...

  6. JavaScript基础教程

    功能介绍: (1)数据验证 弹出提示的对话框,产生判断的效果. (2)气泡提示窗口 右下角等等一类的窗口 (3)产生新窗口 (4)无边框窗口背景变灰,也是可以节约系统资源的

  7. edittext判断获取焦点 有焦点显示clear

    mPhoneEt.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange( ...

  8. 基于JAVA语言的多线程技术

    1.简介 多线程技术属于操作系统范围内的知识: 进程与线程 可以这么理解,一个应用程序就是一个进程,在一个进程中包含至少一个线程:进程就是线程的容器,真正工作.处理任务的是线程. 进程是操作系统分配资 ...

  9. Envelope几何对象 Curve对象几何对象 Multipatch几何对象 Geometry集合接口 IGeometryCollection接口

    Envelope是所有几何对象的外接矩形,用于表示几何对象的最小边框,所有的几何对象都有一个Envelope对象,IEnvelope是Envelope对象的主要接口,通过它可以获取几何对象的XMax, ...

  10. Ubuntu系统如何卸载并安装新版本的jdk(permission denied问题)

    1.如果是自带的openjdk运行下面可以删除: sudo apt-get purge openjdk* 但是这种情况又不一定成功,有时候运行java -version发现还是可以运行的.证明删除不成 ...