【问题标题】:IOS ,How can I loop for dic in dic in array for replace null value for empty stringIOS,如何在数组中的 dic 中循环 dic 以替换空字符串的空值
【发布时间】:2014-01-22 04:21:06
【问题描述】:

从服务器返回的数据中有一个空值

如何通过 NSJSONSerialization 或其他方法将空值替换为空字符串?

我的 JSON 数据是:

{ 
 person:{
       [{name:name1,.....},{name:name2,....}]
      },
 class:{
       [{classname:null,.....},{classname:classname2,....}]
      }
}

感谢您的提前。

【问题讨论】:

    标签: ios json nsdictionary nsjsonserialization


    【解决方案1】:

    创建生命周期类别以替换 Null

    创建类别(用空格替换空字符串)

    NSDictionary+NullReplacement.h

    #import <Foundation/Foundation.h>
    @interface NSDictionary (NullReplacement)
    - (NSDictionary *)dictionaryByReplacingNullsWithBlanks;
    @end
    

    NSDictionary+NullReplacement.m

    #import "NSDictionary+NullReplacement.h"
    #import "NSArray+NullReplacement.h"
    
    @implementation NSDictionary (NullReplacement)
    
    - (NSDictionary *)dictionaryByReplacingNullsWithBlanks {
        const NSMutableDictionary *replaced = [self mutableCopy];
        const id nul = [NSNull null];
        const NSString *blank = @"";
    
        for (NSString *key in self) {
            id object = [self objectForKey:key];
            if (object == nul) [replaced setObject:blank forKey:key];
            else if ([object isKindOfClass:[NSDictionary class]]) [replaced setObject:[object dictionaryByReplacingNullsWithBlanks] forKey:key];
            else if ([object isKindOfClass:[NSArray class]]) [replaced setObject:[object arrayByReplacingNullsWithBlanks] forKey:key];
        }
        return [NSDictionary dictionaryWithDictionary:[replaced copy]];
    }
    
    @end
    

    再创建一个类别(将空数组替换为黑色空间)

    NSArray+NullReplacement.h

    #import <Foundation/Foundation.h>
    @interface NSArray (NullReplacement)
    - (NSArray *)arrayByReplacingNullsWithBlanks;
    @end
    

    NSArray+NullReplacement.m

    #import "NSArray+NullReplacement.h"
    #import "NSDictionary+NullReplacement.h"
    
    @implementation NSArray (NullReplacement)
    
    - (NSArray *)arrayByReplacingNullsWithBlanks  {
        NSMutableArray *replaced = [self mutableCopy];
        const id nul = [NSNull null];
        const NSString *blank = @"";
        for (int idx = 0; idx < [replaced count]; idx++) {
            id object = [replaced objectAtIndex:idx];
            if (object == nul) [replaced replaceObjectAtIndex:idx withObject:blank];
            else if ([object isKindOfClass:[NSDictionary class]]) [replaced replaceObjectAtIndex:idx withObject:[object dictionaryByReplacingNullsWithBlanks]];
            else if ([object isKindOfClass:[NSArray class]]) [replaced replaceObjectAtIndex:idx withObject:[object arrayByReplacingNullsWithBlanks]];
        }
        return [replaced copy];
    }
    
    @end
    

    仅使用单行并在没有空字典的情况下享受

    #import "NSDictionary+NullReplacement.h"
    
    NSDictionary * withoutNullResultDict=[resultDict dictionaryByReplacingNullsWithBlanks];
    

    【讨论】:

      【解决方案2】:

      您需要通过Dictionary iterate 获取值为 null 的键:

      尝试类似的:

       NSArray *keys= [json allKeys];
              for (NSString *keysV in keys){
                  NSLog(@"Keys are %@", keysV);
              if([[Your_Dict objectForKey: keysV] isEqual:[NSNull null]]){
              //Do your stuff  here 
              }
          }
      

      编辑:我没有测试过。

      NSArray *keys= [json allKeys];
          for (NSString *keysV in keys){
              for(NSDictionary *subDict in [yourDict objectForKey: keysV]){
                  NSArray *subKeys = [subDict allKeys];
                  for (NSString *keysVv in subKeys){
                      if([[subDict objectForKey: keysVv] isEqual:[NSNull null]]){
                          //Do your stuff here
                      }
                  }
              }
      }
      

      【讨论】:

      • 谢谢,但它会循环通过 1Lv dic,例如 {person,class} 我想去一级深度
      • 然后对另一个循环重复相同的操作。意思是,遍历字典。
      • 试试类似的,\NSArray *keys= [json allKeys]; for (NSString *keysV in keys){ for(NSDictionary *subDict in [yourDict objectForKey: keysV]){ NSArray *subKeys = [subDict allKeys]; for (NSString *keysVv in subKeys){ if([subDict objectForKey: keysVv] isEqual:[NSNull null]]){ //在这里做你的东西 }} }
      【解决方案3】:

      我也遇到了同样的问题,我可以通过转换NSMutableDicrionary 中的数据来解决这个问题,如果有任何空数据出现,我会不断检查数据,然后用空白字符串替换。 试试看可能对你有帮助。

      -(void)ConfigureCell:(int)Section :(int)Index :(NSMutableArray *)threadArray{
      NSMutableDictionary *threadDict=[threadArray objectAtIndex:Index];
      
          if( [[threadDict objectForKey:@"read"]boolValue]){
      
          }
          CGRect subjectLabelSize;
          self.contactNameLabel.text=@"1323123123123";
          self.lastMessageLabel.text=[threadDict objectForKey:@"lastMessage"];
          if ([[threadDict objectForKey:@"subject"] isEqual:[NSNull null]]) {
              self.subjectLabel.text=@"";
          }
      }
      

      【讨论】:

      • 这种方法是蛮力的。我尝试了这个,但在我的应用程序中不便。我的应用程序有很多来自服务器的数据。
      【解决方案4】:

      使用以下代码:

      for (NSDictionary * test in Your_Array)
                  {
                      for (id dict in [test allKeys] )
                      {
                          ([test valueForKey:dict] == [NSNull null]) ? [test setValue:@"" forKey:dict] :[test setValue:[test valueForKey:dict] forKey:dict];
                      }
                  }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-25
        • 2019-08-07
        • 2019-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-16
        相关资源
        最近更新 更多