NSObject+Json.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. //
  2. // NSObject+Json.h
  3. // Json反序列化代码
  4. //
  5. // Created by Alexi on 12-11-15.
  6. // Copyright (c) 2012年. All rights reserved.
  7. //
  8. #import <Foundation/Foundation.h>
  9. /*
  10. * 说明:
  11. * 使用该代码的前提: 因需要通过json中返回的key值,查找相应的数据类型,然后再进行赋
  12. * 所以在客户端在拿到服务端返回的json字符串后,客户端进行数据Modal定义时,Modal的属性名与json中的一致。
  13. * 举例如下:
  14. * 服务端返回的一个User对像的json串
  15. * {"name":"Alexi","age":26}
  16. * 那么本地定义如下:
  17. * @interface User : NSObject
  18. * {
  19. * NSString *_name;
  20. * NSInteger _age;
  21. * }
  22. *
  23. * @property (nonatomic, copy) NSString *name;
  24. * @property (nonatomic, assign) NSInteger age;
  25. *
  26. * @end
  27. */
  28. @interface NSObject (Json)
  29. // 因Server端经常使用id作表字段,而objc中id是关键字,不能作为属性
  30. // 所以解析前,先检查有不有id字段
  31. // 如果有,则对属性进行赋值
  32. // 具体由子类进行重写
  33. - (void)setIdPropertyValue:(id)idkeyValue;
  34. // 设置复杂对象
  35. - (void)setValueForPropertyValue:(id)idkeyValue forKey:(NSString *)key propertyClass:(Class)cls tagretClass:(Class)targetCls;
  36. // 将json数据反序列化成一个对象
  37. // Json格式如下:
  38. /*
  39. {"name":"Alexi","age":26,"studentId":"06061096","QQ":"403725592"}
  40. */
  41. + (id)parse:(Class)aClass jsonString:(NSString *)json;
  42. + (id)parse:(Class)aClass dictionary:(NSDictionary *)dict;
  43. // 对于格式如下的方法,使用以下接口进行反序化
  44. /*
  45. * [{itemClass对应的json串},{itemClass对应的json串}...]
  46. */
  47. + (NSMutableArray *)loadItem:(Class)itemClass fromDictionary:(NSArray *)arraydict;
  48. + (NSMutableArray *)loadItem:(Class)itemClass fromJsonString:(NSString *)json;
  49. + (NSMutableArray *)loadItem:(Class)itemClass fromArrayDictionary:(NSArray *)arraydict;
  50. // 将json数据反序列化成一个对象
  51. // 缺点 : 不能解格嵌套的数组
  52. // Json格式如下:
  53. /*
  54. {"name":"Alexi","age":26,"studentId":"06061096","QQ":"403725592",bookItems:[{bookItemClass对应的json串},{bookItemClass对应的json串}...]}
  55. */
  56. + (id)parse:(Class)aClass dictionary:(NSDictionary *)dict itemClass:(Class)itemClass;
  57. + (id)parse:(Class)aClass jsonString:(NSString *)json itemClass:(Class)itemClass;
  58. // 目前代码中存在以下问题,后期再进行更新
  59. // 对于Json格式如下的数据不能直接反序列化成对象:
  60. /*
  61. {"name":"Alexi","age":26,"studentId":"06061096","QQ":"403725592",bookItems:[{bookItemClass对应的json串},{bookItemClass对应的json串}...],friends:[{friendClass对应的json串},{friendClass对应的json串}...]}
  62. * 可先调用
  63. * [NSObject parse:[User class] dictionary:dict]; 将一些普通的属性进行设置
  64. * 然后再获取到
  65. * bookItems对应的Json列表: NSArray *bookItemJsonArray = [dict objectForKey:@"bookItems"];
  66. * self.bookItems = [self loadItem:[BookItem class] fromDictionary:bookItemJsonArray];
  67. * 同理可对friends进行设置
  68. */
  69. - (void)propertyListOfClass:(Class)aclass propertyList:(NSMutableDictionary *)propertyDic;
  70. // 把对象的属性(会将其至基类NSObject的所有属性)序列化成Json字典, 以属性名作为键值
  71. - (id)serializeToJsonObject;
  72. // 把对象自身的属性序列化成Json字典, 以属性名作为键值
  73. - (id)serializeSelfPropertyToJsonObject;
  74. + (id)loadInfo:(Class)aclass withKey:(NSString *)key;
  75. + (void)saveInfo:(NSObject *)obj withKey:(NSString *)key;
  76. @end
  77. @interface NSArray (serializeToJsonObject)
  78. - (id)serializeToJsonObject;
  79. @end
  80. @interface NSDictionary (serializeToJsonObject)
  81. - (id)serializeToJsonObject;
  82. @end