TouchJSON сериализует структуру словарей и массивов - PullRequest
0 голосов
/ 18 декабря 2011

Вопрос разработки для iPhone (ObjectiveC).

Я пытаюсь использовать библиотеку TouchJSON, и у меня возникли проблемы с сериализацией в JSON.Я включил ARC, поэтому я использую ветку ARC от 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?

1 Ответ

0 голосов
/ 18 декабря 2011

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

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

Метод 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", я понятия не имею.

...