2011-12-18 4 views
0

Вопрос о разработке iPhone (ObjectiveC).TouchJSON сериализует структуру словарей и массивов

Я пытаюсь использовать библиотеку TouchJSON и имею некоторые проблемы с сериализацией JSON. У меня включен ARC, поэтому я использую ARC branch from github.. Я пытаюсь понять, что я считаю довольно простой вложенной структурой. Три словаря внутри и массив внутри словаря.

//Make some dictionaries with simple string pairs 
NSDictionary *dicA = [NSDictionary dictionaryWithObjectsAndKeys:@"x", @"1", @"y", @"2", nil]; 
NSDictionary *dicB = [NSDictionary dictionaryWithObjectsAndKeys:@"x", @"1", @"y", @"2", nil]; 
NSDictionary *dicC = [NSDictionary dictionaryWithObjectsAndKeys:@"x", @"1", @"y", @"2", nil]; 

//Make an array of dictionary objects 
NSArray *saveArray = [NSArray arrayWithObjects:dicA, dicB, dicC, nil]; 

//Make dictionary which has that array as one of the values 
NSDictionary *bigDic = [NSDictionary dictionaryWithObjectsAndKeys:@"arr", saveArray, 
                    @"mmm", @"nnn", nil]; 

NSData *jsonData = [[CJSONSerializer serializer] serializeObject:saveArray error:NULL]; 
//This works '[{"1":"x","2":"y"},{"1":"x","2":"y"},{"1":"x","2":"y"}]' 

NSData *jsonDataB = [[CJSONSerializer serializer] serializeObject:bigDic error:NULL]; 
//This fails 

Когда я пытаюсь сериализации bigDic Это бомбы на время выполнения со следующим:

'NSInvalidArgumentException', причина: «- [__ NSArrayI UTF8String]: непризнанным селектор послал к экземпляру

Сериализация массива на линии выше, похоже, работает нормально. Что случилось с моим bigDic?

ответ

0

После тщательного написания этого вопроса я понял, где я ошибся. Думал, что я все равно отправлю. Возможно, это полезный пример для других. Так что ответ ...

У меня есть словари на переднем плане!

Метод dictionaryWithObjectsAndKeys ожидает ценностей и ключи наоборот, так что правильный способ построения такой структуры:

//Make some dictionaries with simple string pairs 
NSDictionary *dicA = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"x", @"2", @"y", nil]; 
NSDictionary *dicB = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"x", @"2", @"y", nil]; 
NSDictionary *dicC = [NSDictionary dictionaryWithObjectsAndKeys:@"1", @"x", @"2", @"y", nil]; 

//Make an array of dictionary objects 
NSArray *saveArray = [NSArray arrayWithObjects:dicA, dicB, dicC, nil]; 

//Make dictionary which has that array as one of the values 
NSDictionary *bigDic = [NSDictionary dictionaryWithObjectsAndKeys:saveArray, @"arr", 
                    @"nnn", @"mmm", nil]; 

Это имеет смысл, когда вы смотрите на название метода «dictionaryWithObjectsAndKeys», но почему это не делается как «dictionaryWithKeysAndObjects». Я понятия не имею.

+0

Я считаю, что это «withObjectsAndKeys», потому что он соответствует «setObject: forKey:». Последнее, вероятно, соответствует «objectForKey:». :) –

Смежные вопросы