JSONKit: изменение и сериализация значения атрибута JSON - PullRequest
1 голос
/ 16 февраля 2012

Я использую JSONKit для анализа строки JSON в NSDictionary:

NSDictionary *deserializedData = [jsonString objectFromJSONString];

Мой вопрос: как я могу изменить значения словаря и получить измененную строку JSON?

У меня естьпопытался изменить значения словаря:

[deserializedData setObject:[NSNumber numberWithInt:iRatings] forKey:@"ratings"];   

Но приложение вылетает в этой строке.Что я делаю не так?

Заранее спасибо!

Ответы [ 5 ]

5 голосов
/ 16 февраля 2012

В то время как другие ответы верны, вы действительно хотите в этом случае:

NSMutableDictionary *deserializedData = [jsonString mutableObjectFromJSONString];

Метод mutableObjectFromJSONString создаст изменяемый словарь напрямую, что экономит время и память.

2 голосов
/ 31 мая 2012
// 
// we begin with our string in json format
//
NSString *jsonString = [[NSString alloc] initWithString:@"{\"1\":\"Hole 1: Rossy Robinson - $25\",\"2\":\"Hole 7: Davey Ambrose - $25\",\"3\":\"Hole 14: Ross Robinson - $25\"}"];

//
// convert the json string to an NSMutableDictionary
//
NSError *e;
NSMutableDictionary *JSONdic = [NSJSONSerialization JSONObjectWithData: [jsonString dataUsingEncoding: NSUTF8StringEncoding] options: NSJSONReadingMutableContainers error: &e];

//
// change a value and add a new value in the dict
//
NSLog(@"before: object for key 1 is: %@", [JSONdic objectForKey:@"1"]);
[JSONdic setObject:@"xxx" forKey:@"1"];
[JSONdic setObject:@"Phil McQuitty" forKey:@"2"];

//
//convert dictionary object to json data
//
NSData* jsonData = [NSJSONSerialization dataWithJSONObject:JSONdic options:NSJSONWritingPrettyPrinted error:&e];

//
// convert the json data back to a string
//
NSString *jsonText = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];\

//
// print out the final results
//
NSLog(@"back to string: %@", jsonText);
2 голосов
/ 16 февраля 2012

NSDictionary - неизменный словарь, вам нужно NSMutableDictionary, чтобы изменить данные.Я не уверен насчет JSONKit, но встроенный анализатор JSON Cocoa имеет флаг для возврата данных в изменяемые контейнеры.

В худшем случае вы можете сделать что-то подобное:

NSMutableDictionary* data = [NSMutableDictionary dictionaryWithDictionary:[jsonString objectFromJSONString]];
[data setObject:[NSNumber numberWithInt:iRatings] forKey:@"ratings"];
1 голос
/ 16 февраля 2012

Вы пытаетесь так:

NSMutableDictionary *deserializedData = [NSMutableDictionary dictionaryWithDictionary: [jsonString objectFromJSONString]];

и затем измените значения:

[deserializedData setObject:[NSNumber numberWithInt:iRatings] forKey:@"ratings"];   

Для NSDictionary мы не можем добавлять или изменять значения, поэтому происходит сбой приложения.

1 голос
/ 16 февраля 2012

Вы пытаетесь изменить неизменяемый объект.

NSMutableDictionary *deserializedData = [NSMutableDictionary dictionaryWithDictionary: [jsonString objectFromJSONString]];

Это изменяемый словарь, и вы можете изменить значения в нем.

...