[关闭]
@chenbinghua 2018-08-16T16:02:14.000000Z 字数 2583 阅读 1790

解决Json中的NSNull类型和nil / Nil / NULL / NSNull区别

iOS笔记


参考文章
nil / Nil / NULL / NSNull
ios nil、NULL和NSNull 的使用
模拟服务器返回数据
iOS解决json串中的NSNull类型
NSNull Category

nil / Nil / NULL / NSNull区别

一图胜千言

NSNull在Foundation和其它框架中被广泛的使用,以解决如NSArray和NSDictionary之类的集合不能有nil值的缺陷。你可以将NSNull理解为有效的将NULL或者nil值封装boxing,以达到在集合中使用它们的目的

解决json中的NSNull类型

场景:服务器返回的原始Json数据

  1. {
  2. "status": 1,
  3. "service_name": null,
  4. "service_id": null,
  5. "img_url": "http://api.jgfw.me/assets/uploads/files/",
  6. "price": null,
  7. "num": 3,
  8. "service_info": {
  9. "service_type": null,
  10. "service_time": null,
  11. "service_detail": null,
  12. "customer_name": null,
  13. "customer_phone": null,
  14. "customer_address": "",
  15. "new_jishi": "",
  16. "old_jishi": null,
  17. "lat": null,
  18. "lon": null
  19. },
  20. "order_info": {
  21. "order_no": "E15031267469289848688",
  22. "pay_time": null,
  23. "order_time": null,
  24. "price": 0,
  25. "order_state": null
  26. }
  27. }

AFN请求后打印出来的数据

http://www.mocky.io/模拟返回上面的Json数据

点击http://www.mocky.io/v2/58997cf60f000094021f4ae7
就可以访问访问的json数据

然后用AFN访问。

新建Util类

  1. //
  2. // Util.m
  3. // AFNDemo
  4. //
  5. // Created by 陈炳桦 on 17/2/7.
  6. // Copyright © 2017年 la.baibu. All rights reserved.
  7. //
  8. #import "Util.h"
  9. @implementation Util
  10. #pragma mark - 私有方法
  11. //将NSDictionary中的Null类型的项目转化成@""
  12. +(NSDictionary *)nullDic:(NSDictionary *)myDic
  13. {
  14. NSArray *keyArr = [myDic allKeys];
  15. NSMutableDictionary *resDic = [[NSMutableDictionary alloc]init];
  16. for (int i = 0; i < keyArr.count; i ++)
  17. {
  18. id obj = [myDic objectForKey:keyArr[i]];
  19. obj = [self changeType:obj];
  20. [resDic setObject:obj forKey:keyArr[i]];
  21. }
  22. return resDic;
  23. }
  24. //将NSDictionary中的Null类型的项目转化成@""
  25. +(NSArray *)nullArr:(NSArray *)myArr
  26. {
  27. NSMutableArray *resArr = [[NSMutableArray alloc] init];
  28. for (int i = 0; i < myArr.count; i ++)
  29. {
  30. id obj = myArr[i];
  31. obj = [self changeType:obj];
  32. [resArr addObject:obj];
  33. }
  34. return resArr;
  35. }
  36. //将NSString类型的原路返回
  37. //过滤掉诡异的"null"和"(null)"字符串
  38. +(NSString *)stringToString:(NSString *)string
  39. {
  40. if ([string isEqualToString:@"null"] || [string isEqualToString:@"(null)"]) {
  41. return @"";
  42. }else{
  43. return string;
  44. }
  45. }
  46. //将Null类型的项目转化成@""
  47. +(NSString *)nullToString
  48. {
  49. return @"";
  50. }
  51. #pragma mark - 公有方法
  52. //类型识别:将所有的NSNull类型转化成@""
  53. +(id)changeType:(id)myObj
  54. {
  55. if ([myObj isKindOfClass:[NSDictionary class]])
  56. {
  57. return [self nullDic:myObj];
  58. }
  59. else if([myObj isKindOfClass:[NSArray class]])
  60. {
  61. return [self nullArr:myObj];
  62. }
  63. else if([myObj isKindOfClass:[NSString class]])
  64. {
  65. return [self stringToString:myObj];
  66. }
  67. else if([myObj isKindOfClass:[NSNull class]])
  68. {
  69. return [self nullToString];
  70. }
  71. else
  72. {
  73. return myObj;
  74. }
  75. }
  76. @end

AFN过滤处理

  1. AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
  2. [manager GET:@"http://www.mocky.io/v2/58996b8b0f00007a011f4a9e" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
  3. // 过滤前
  4. NSLog(@"过滤前----%@",responseObject);
  5. // 过滤后
  6. NSLog(@"过滤后---%@",[Util nullDic:responseObject]);
  7. } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
  8. NSLog(@"%@",error);
  9. }];

结果

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注