如果json数据等于nil,如何删除?

时间:2015-08-20 10:52:47

标签: objective-c nsarray nsjsonserialization

category =     (
                {
            "category_id" = 18;
            column = 1;
            description = "Electrician Works";
            image = "images/Electrician.jpg";
            "meta_description" = "Electrician Works";
            "meta_keyword" = "Electrician Works";
            name = Electrician;
            "parent_id" = "";
            "sort_order" = 3;
            status = enable;
            subcategory =             (
            );
            top = "";
        },
                {
            "category_id" = 19;
            column = 1;
            description = "Plumbing Works";
            image = "images/Plumber.png";
            "meta_description" = "Plumbing Works";
            "meta_keyword" = "Plumbing Works";
            name = Plumber;
            "parent_id" = "";
            "sort_order" = 1;
            status = disable;
            subcategory =             (
            );
            top = "";
        },
{
            "category_id" = 37;
            column = 0;
            description = "";
            image = "images/SUV.jpg";
            "meta_description" = "";
            "meta_keyword" = "";
            name = SUV;
            "parent_id" = 20;
            "sort_order" = 3;
            status = enable;
            subcategory =             (
            );
            top = "";
        }

如果parent_id =""然后其他值必须删除。

我存储了值名称& parent_id在这里

 {
    name = Microwave;
    parent = "";
},
    {
    name = Hatchback;
    parent = 20;
},
    {
    name = Sedan;
    parent = 20;
},
    {
    name = SUV;
    parent = 20;
}

如果父ID不存在,那么我必须从数组中删除,朋友任何人帮我找出这个问题。

-(void)responseFunction:(NSMutableDictionary*)response
{
    BOOL sucess;
    sucess =[response objectForKey:@"sucess"];
    if(!sucess)
    {
        NSLog(@"%@",response);
        arrDicCategory=[response objectForKey:@"category"];
        for(NSDictionary *dicAllCategory in arrDicCategory)
        {
            NSMutableDictionary *dicStorage=[[NSMutableDictionary alloc]init];
            [dicStorage setObject:[[dicAllCategory objectForKey:@"name"] length] !=0?[dicAllCategory objectForKey:@"name"]:@"" forKey:@"name"];
//            [dicStorage setObject:[dicAllCategory objectForKey:@"parent_id"]!=Nil?[dicAllCategory objectForKey:@"parent"]:@"" forKey:@"parentid"];
            [dicStorage setObject:[dicAllCategory objectForKey:@"parent_id"] forKey:@"parent"];
            [arrDicName addObject:dicStorage];
            NSLog(@"%@",arrDicName);
        }
    }
}

这是我的代码......

I NEED OUTPUT LIKE THIS

    name = Hatchback;
    parent = 20;


    name = Sedan;
    parent = 20;


    name = SUV;
    parent = 20;

我正在尝试使用以下代码删除值:

for(int i=0; i<arrDicName.count ; i++)
        {
          if([[arrDicName objectAtIndex:i]objectForKey:@"parent"]==Nil)
            {
                [arrDicName removeObject:[[arrDicName objectAtIndex:i]objectForKey:@"parent"]];
                NSLog(@"AfterRemovingFromThearray%@",arrDicName);
            }
        }

我理解的代码有些不对劲,但我无法找到它,所以最后我来到这里帮助我的朋友。

3 个答案:

答案 0 :(得分:1)

尝试以下代码。我已根据您的要求创建了一个虚拟字典和数组。

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"" forKey:@"parent_id"];
[dict setObject:@"abc" forKey:@"name"];

NSMutableDictionary *dict1 = [[NSMutableDictionary alloc] init];
[dict1 setObject:@"1" forKey:@"parent_id"];
[dict1 setObject:@"abcq" forKey:@"name"];

NSMutableDictionary *dict2 = [[NSMutableDictionary alloc] init];
[dict2 setObject:@"" forKey:@"parent_id"];
[dict2 setObject:@"sss" forKey:@"name"];

NSMutableDictionary *dict3 = [[NSMutableDictionary alloc] init];
[dict3 setObject:@"2" forKey:@"parent_id"];
[dict3 setObject:@"ddd" forKey:@"name"];

arrTemp = [[NSMutableArray alloc] init];
[arrTemp addObject:dict];[arrTemp addObject:dict1];[arrTemp addObject:dict2];[arrTemp addObject:dict3];

NSMutableIndexSet *indexesToDelete = [NSMutableIndexSet indexSet];
NSUInteger currentIndex = 0;

for (id obj in arrTemp) {
    if([[obj objectForKey:@"parent_id"] isEqualToString:@""]){
        [indexesToDelete addIndex:currentIndex];
    }
    currentIndex++;
}

[arrTemp removeObjectsAtIndexes:indexesToDelete];
NSLog(@"%@", arrTemp);

希望有所帮助。如果它没有解决您的问题,请告诉我。

答案 1 :(得分:1)

您的代码片段有几个问题:

  1. 您正在针对"parent"测试Nil密钥。密钥永远不会是nil,因为Objective-C集合类中不允许它们。而是测试length > 0
  2. 您正在从正在枚举的数组中删除对象,从而有效地更改了数组的长度。这将导致索引越界异常或遗漏元素等问题。
  3. 最好的方法是创建一个新数组并复制通过测试的元素:

    NSMutableArray filteredArray = [NSMutableArray new];
    for (NSDictionary *dict in arrDicName)
    {
        NSString *parent = dict[@"parent"];
        if (parent.length > 0)
            [filteredArray addObject:dict];
    }
    arrDicName = filteredArray;
    

答案 2 :(得分:0)

- (BOOL)isEmptyString:(NSString *)yourParentID
{
    BOOL isEmp = NO;

    if([[yourParentID stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length] == 0)
    {
        isEmp = YES;
    }
    else
    {
        isEmp = NO;
    }

    return isEmp;
}

按照下面的代码

NSString *parentId = [NSString stringWithFormat:@"%@",[[arrDicName objectAtIndex:i]objectForKey:@"parent"]];

    if([self isEmptyString:parentId])
    {
        // Parent id is nil 
        // Do the rest
    }
    else
    {
        // Parent id is not nil
    }

希望这会对你有所帮助