如何在 NSDictionary 中搜索和替换?

how to search and replace in NSDictionary?

我有一个 JSON 已转换为 NSDictionary,现在我想搜索并替换其中的一些值,但我不知道该怎么做,

{  
   "CODE":200,
   "APICODERESULT":"USER_INTERESTS",
   "MESSAGE":"user interests fetched successfully",
   "VALUE":{  
      "Books":[  
         {  
            "key":"7",
            "value":"Fiction",
            "selected":true
         },
         {  
            "key":"8",
            "value":"Romantic",
            "selected":true
         }
      ],
      "Music":[  
         {  
            "key":"11",
            "value":"Classical",
            "selected":false
         },
         {  
            "key":"12",
            "value":"Jazz",
            "selected":false
         },
         {  
            "key":"10",
            "value":"Pop",
            "selected":false
         },
         {  
            "key":"13",
            "value":"Western",
            "selected":false
         }
      ]
   }
}

这里我有 key 的值,我想在字典中搜索,当我找到那个键和我拥有的值时,我想替换 selected 的值同一个街区。

例如:-

我的 key 值为 10 然后我想将所选键的值更改为 true 所以它看起来像这样

{  
   "CODE":200,
   "APICODERESULT":"USER_INTERESTS",
   "MESSAGE":"user interests fetched successfully",
   "VALUE":{  
      "Books":[  
         {  
            "key":"7",
            "value":"Fiction",
            "selected":true
         },
         {  
            "key":"8",
            "value":"Romantic",
            "selected":true
         }
      ],
      "Music":[  
         {  
            "key":"11",
            "value":"Classical",
            "selected":false
         },
         {  
            "key":"12",
            "value":"Jazz",
            "selected":false
         },
         {  
            "key":"10",
            "value":"Pop",
            "selected":true
         },
         {  
            "key":"13",
            "value":"Western",
            "selected":false
         }
      ]
   }
}

将您的输入字典视为 mainDictionary 并使用以下代码:

NSMutableDictionary *valuesDic = [mainDictionary objectForKey:@"VALUES"];


NSArray *allPossibleKeysArray = [valuesDic allKeys];

for (int j=0; j<allPossibleKeysArray.count; j++) {

    NSString *keyStr = [allPossibleKeysArray objectAtIndex:j];

    NSArray *array = [valuesDic objectForKey:keyStr];

    for (int i=0; i<array.count; i++) {

        NSMutableDictionary *dictionary = [array objectAtIndex:i];

        NSString *keyString = [NSString stringWithFormat:@"%@",[dictionary objectForKey:@"key"]];

        if([keyString isEqualToString:keyvalue]){

            [dictionary removeObjectForKey:@"selected"];
            [dictionary setObject:[NSNumber numberWithBool:true] forKey:@"selected"];
        }
    }
}

希望对您有所帮助!!

您应该在将 JSON/moving 解析为模型时进行此类更改。下面的代码是一种解决方法:

NSDictionary *initialJson = //Your JSON here
NSArray *allSubKeys= [initialJson[@"Value"] allKeys];

// Your mutable output.
NSMutableDictionary *mutableJson = [initialJson mutableCopy]

for(NSString *key in allSubKeys) {//Music && Books
    // Create another cointainer here
    for(NSArray *arr in mutableJson[@"Value][key]) {
       // Create another cointainer here           
       for(NSDictionary *dict in arr) {//key, value, selected
           for (NSString *key2 in [dict allKeys]) {
               if ([key2 isEqualToString:@"selected"] && [dict[@"value"] equals:@10]) {
                   // Save YES here
               }
               else {
                   // Just copy element
               }
               // Add object to parent container
           }
           // Add object to parent container
       }
       // Add object to parent container           
    }
    // Add object to parent container
}

这是完整的解决方案

NSString* str=@"{\"CODE\":200,\"APICODERESULT\":\"USER_INTERESTS\",\"MESSAGE\":\"user interests fetched successfully\",\"value\":{\"Books\":[{\"key\":\"7\",\"value\":\"Fiction\",\"selected\":true},{\"key\":\"8\",\"value\":\"Romantic\",\"selected\":true}],\"Music\":[{\"key\":\"11\",\"value\":\"Classical\",\"selected\":false},{\"key\":\"12\",\"value\":\"Jazz\",\"selected\":false},{\"key\":\"10\",\"value\":\"Pop\",\"selected\":false},{\"key\":\"13\",\"value\":\"Western\",\"selected\":false}]}}";
    NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSMutableDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

    NSLog(@"dictionary before updating: %@", dictionary);
    // copy old dict
    NSMutableDictionary* newDict=[[[NSMutableDictionary alloc]init]autorelease];
    [newDict addEntriesFromDictionary:dictionary];
    // get the entry to be changed
    NSMutableDictionary* valueDict=[[[NSMutableDictionary alloc]init]autorelease];
    [valueDict addEntriesFromDictionary:newDict[@"value"]];
    NSMutableArray* musicArray=[[[NSMutableArray alloc] init] autorelease];
    [musicArray addObjectsFromArray:newDict[@"value"][@"Music"]];
    // get the music array and change your property
    NSMutableDictionary* musicDict2=[[[NSMutableDictionary alloc] init] autorelease];
    [musicDict2 addEntriesFromDictionary:[musicArray objectAtIndex:2]];
    [musicDict2 setValue:[NSNumber numberWithBool:YES] forKey:@"selected"];
    [musicArray replaceObjectAtIndex:2 withObject:musicDict2];
    // update the value dictionary
    [valueDict setObject:musicArray forKey:@"Music"];
    //update the new dictionary
    [newDict setObject:valueDict forKey:@"value"];
    NSLog(@"dictionary after updating: %@", newDict);