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. Struts2中的验证框架

    通过注解的方式,可以让方法不用验证 @SkipValidation public String toRegView() { System.out.println("toRegView&quo ...

  2. linux的学习系列 1---简介

    Linux简介 严格的来讲,Linux 不算是一个操作系统,只是一个 Linux 系统中的内核,即计算机软件与硬件通讯之间的平台:Linux的全称是GNU/Linux,这才算是一个真正意义上的Linu ...

  3. map & flatMap 浅析

    我之前一直以为我是懂 map 和 flatMap 的.但是直到我看到别人说:「一个实现了 flatMap 方法的类型其实就是 monad.」我又发现这个熟悉的东西变得陌生起来,本节烧脑体操打算更细致一 ...

  4. POJ 1236 Network of Schools(tarjan算法 + LCA)

    这个题目网上有很多答案,代码也很像,不排除我的.大家的思路应该都是taijan求出割边,然后找两个点的LCA(最近公共祖先),这两个点和LCA以及其他点构成了一个环,我们判断这个环上的割边有几条,我们 ...

  5. AnimationSet的使用

    Animations的使用(3) 1 AnimationSet的使用方法 什么是AnimationSet 1 AnimationSet是Animation的子类 2 一个AnimationSet包含了 ...

  6. 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换

                                      软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...

  7. FusionCharts使用问题及解决方法(二)-FusionCharts常见问题大全

    在上文中,我们介绍了FusionCharts常见问题(FAQ)的解决方法,本文将一同讨论FusionCharts使用者面临的一些复杂问题的解决方法. 如何启用JavaScript调试模式? 要启用Ja ...

  8. USACO Section 1.3 Prime Cryptarithm 解题报告

    题目 题目描述 牛式的定义,我们首先需要看下面这个算式结构: * * * x * * ------- * * * <-- partial product 1 * * * <-- parti ...

  9. 深入浅出Ajax(三)

    <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> &l ...

  10. fragment 数据传递,通信

    Fragment之间的通信   在本节中,你会学到 1.定义接口 2.实现接口 3.将消息传递给fragment 为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己 ...