Thomas
Thomas

Reputation: 622

Updating key in NSMutableDictionary

 json is a NSMutableDictionary with a key "message". I need to "clean" the data in that key using stringByReplacingOccurrencesOfString

NSLog(@"json: %@", json); outputs this:

json: {
    conversationId = 61;
    countmessagesinconversation = 2;
    message = "Messages exist!";
    messagesinconversation =     (
                {
            message = "Hi";
            messagecreated = "June 24, 2013 16:16";
            messageid = 68;
            sentby = Thomas;
            sentbyID = 1;
            title = "Subject";
        },

                {
            message = "What's  up?";
            messagecreated = "September 22, 2013 17:00";
            messageid = 331;
            sentby = Steve;
            sentbyID = 2;
            title = "Subject";
        }
    );
    success = 1;
}

So, this is what I've come up with, but I'm clearly getting it all wrong.

NSString *newstr = [[NSString alloc]init];

    for (newstr in [[[json objectForKey:@"messagesinconversation"]allKeys]copy]){
        newstr = [newstr stringByReplacingOccurrencesOfString:@" "
                                             withString:@""];
        [json setValue:newstr forKey:@"message"];
    }

Could somebody please help me out with this and explain so I understand the concept? I know how to do this with an array but what my problem is (I think) is that I do not fully understand how to access the right key in the dictionary.

Edit: Sorry for not being clear in my question. What happens is that if there are two space characters in the key message then " " shows up when I display it on the screen.

Upvotes: 0

Views: 140

Answers (3)

Peter Sarnowski
Peter Sarnowski

Reputation: 11970

//First get the array of message dictionaries:
NSArray * messages = [json objectForKey:@"messagesinconversation"];

//create new array for new messages
NSMutableArray * newMessages = [NSMutableArray arrayWithCapacity:messages.count];

//then iterate over all messages (they seem to be dictionaries)
for (NSDictionary * dict in messages)
{
    //create new mutable dictionary
    NSMutableDictionary * replacementDict = [NSMutableDictionary dictionaryWithDictionary:dict];

    //get the original text
    NSString * msg = [dict objectForKey:@"message"];

    //replace it as you see fit
    [replacementDict setObject:[msg stringByReplacingOccurrencesOfString:@" " withString:@""] forKey:@"message"];

    //store the new dict in new array
    [newMessages addObject:replacementDict];
}

//you are done - replace the messages in the original json dict
[json setObject:newMessages forKey:@"messagesinconversation"];

Upvotes: 1

Hermann Klecker
Hermann Klecker

Reputation: 14068

Now that the requirements are more clear I'll try an answer. I try to use the same names as in your question and suggested in erlier answers.

Make json an NSMUtableDictionary where you declare it. Then go forward:

json = [json mutableCopy]; // creates a mutable dictionary based on json which is immutable as result of the json serialization although declared as mutable. 

NSMutableArray *msgArray = [[json objectForKey:@"messagesinconversation"] mutableCopy];  //this fetches the array from the dictinary and creates a mutable copy of it. 
[json setValue:newstr forKey:@"messagesinconversation"];  // replace the original immutable with the mutable copy. 

for (int i = 0; i < [msgArray count]; i++) {
    NSMutableDictionary mutableInnerDict = [[msgArray objectAtIndex:i] mutableCopy]; // fetching the i-th element and replace it by a mutable copy of the dictionary within. 
    [msgArray replaceObjectAtIndex:i withObject:mutableInnerDict]; // it is now mutable and replaced within the array. 
    NSString *newString = [[[msgArray objectAtindex:i] objectForKey:@"message"]  stringByReplacingOccurrencesOfString:@"&nbsp;" withString:@" "];  // crates a new string with all &nbsp removed with blanks. 
    [mutableInnerDict setValue:newString forKey:@"message"];
}

Regarding the replacement of &nbsp with " ", is this really what you want? I am asking because &nbsp does not occur in your sample data. Or do you want to remove blanks at all?

Upvotes: 0

iPatel
iPatel

Reputation: 47099

Add your array of dictionary in another mutable array

NSMutableArray *msgArray = [[json objectForKey:@"messagesinconversation"] mutableCopy];

Use for loop for access it.

for (int i = 0 ; i < msgArray.count ; i++)
{
     [[[msgArray objectAtindex:i] objectForKey:@"message"]  stringByReplacingOccurrencesOfString:@"&nbsp;" withString:@""];
}

[self.mainJSONDic setValue:msgArray forKey:@"messagesinconversation"];

Try this code might helpful in your case:

Upvotes: 0

Related Questions