Сортировка NSDictionary из JSON для UITableView

У меня возникают проблемы при попытке отсортировать мой NSDictionary по порядку, и это были недели, и я до сих пор не понял этого, поэтому я хотел бы, чтобы кто-нибудь мог помочь мне здесь ...

Данные NSDictionary взяты из JSON, и данные уже отсортированы с сервера, и они отображаются по порядку в JSON, но когда они извлекаются и преобразуются в NSDicitionary, порядок все неправильный ...

Это JSON

<code>{ 
  "categories":{
   "unknownCategoryName":[
   { "key1":"value1",
     "key2":"value2"
   }],
   "unknownCategoryName1":[
   { "key1":"value1",
     "key2":"value2"
   }],
   "unknownCategoryName2":[
   { "key1":"value1",
     "key2":"value2"
   }],
   "unknownCategoryName3":[
   { "key1":"value1",
     "key2":"value2"
   }]
  }
 }
</code>

Количество категории и ее название не будут известны, пока не будет получен JSON, так что это то, что я использую для подсчета и настройки tableView и раздела

<code>NSDictionary *results = [jsonString JSONValue];

NSDictionary *all = [results objectForKey:@"categories"];
self.datasource = all;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
   return [self.datasource count];
  }

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
   NSString *title = [[self.datasource allKeys] objectAtIndex:section];
   return title;
 }
</code>

И что я хочу сделать, это перечислить раздел и заголовок раздела как порядок в JSON .... вместо отображения хаоса, как

unknownCategory3
unknownCategory1
unknownCategory
unknownCategory2

& Quot; неизвестная категория & quot; Имя продукта категории, они не в алфавитном порядке, без какого-либо номера, и они уже отсортированы и отображаются в порядке в JSON ...

Так что было бы здорово, если бы вы, ребята, могли помочь. Заранее спасибо...

Ответы на вопрос(4)

что вы не можете редактировать? Это выглядит уродливо для меня. Категории должны быть массивом, и текущее размещение массива не имеет смысла. Если JSON выглядел так:

{ 
  categories:[
   {unknownCategoryName:
   { key1:value1,
     key2:value2
   }},
   {unknownCategoryName2:
   { key1:value1,
     key2:value2
   }}
  ]
 }

Затем вы можете читать категории в NSArray, и ваши методы делегата будут выглядеть так (и отображаться в правильном порядке):

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  {
      return [categoriesArray count];
  }

 - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
     NSDictionary *dict = [categoriesArray objectAtIndex:section];  
     NSString *title = [[dict allKeys] objectAtIndex:0];
     return title;
 }
 S Arumik30 апр. 2012 г., 18:17
пробовал ... не работает, порядок все еще испорчен ... = (
 30 апр. 2012 г., 18:53
Структура массива в JSON будет считана в NSArray в том же порядке, что и в JSON, поэтому вы делаете что-то не так.
 S Arumik30 апр. 2012 г., 18:00
Спасибо за напоминание JSON. Но похоже на порядок в NSDictionary * results = [jsonString JSONValue]; уже испорчен ... даже если я конвертирую & quot; результат & quot; в массив, порядок по-прежнему не такой же, как в JSON ...
 30 апр. 2012 г., 18:06
Вам не нужно преобразовывать его в массив. Вы читаете его как массив, и порядок останется прежним. NSArray * CategoriesArray = [Results ObjectForKey: @ & Quot; Categories & quot;];
Решение Вопроса

поэтому вам необходимо сначала отсортировать ключи, прежде чем использовать их в табличном представлении. Поэтому вместо использования [self.datasource allKeys] для получения заголовков разделов сначала создайте отсортированный массив: sorted = [[self.datasource allKeys] sortedArrayUsingSelector: @selector (caseInsensitiveCompare :)], а затем используйте этот массив для получения title: title = [отсортированный объектAtIndex: раздел].

После редактирования, чтобы ответить на следующий вопрос:

Чтобы использовать отсортированный массив, чтобы получить нужные значения в таблицу, я думаю, это должно быть близко. Вам нужно будет добавить свойство NSArray * sorted в ваш файл .h, а затем это в ваш .m (предполагается, что структура вашего json такая же, как вы опубликовали выше):

 NSDictionary *results = [jsonString JSONValue];
    NSDictionary *all = [results objectForKey:@"categories"];
    self.datasource = all;
    self.sorted = [[self.datasource allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return [self.sorted count];
    }

    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
        NSString *title = [self.sorted objectAtIndex:section];
        return title;
    }

   - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [[self.datasource valueForKey:[self.sorted objectAtIndex:section]]count];
   }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *cellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
        }
        NSArray *theArray = [self.datasource valueForKey:[self.sorted objectAtIndex:indexPath.section]];
        NSString *text1 = [[theArray objectAtIndex:0] valueForKey:@"key1"];
        NSString *text2 = [[theArray objectAtIndex:0] valueForKey:@"key2"];
        cell.textLabel.text = [NSString stringWithFormat:@"%@\r%@",text1,text2];
        cell.textLabel.numberOfLines=0; // this set the number of lines to unlimited
        return cell;
    }

Вы не сказали, как хотите отображать два разных значения в одной строке таблицы - в этом примере я объединил их в одну строку с возвратом между ними.

 S Arumik30 апр. 2012 г., 18:11
значения заголовков разделов расположены не в алфавитном порядке и не содержат чисел, поэтому их нельзя сравнивать ... фактически они перечислены в порядке в JSON ...
 S Arumik30 апр. 2012 г., 19:33
да, они строковые ... но они в японских символах, поэтому я не уверен, как их отсортировать, чтобы получить тот же порядок, что и в файле JSON ...
 30 апр. 2012 г., 19:20
Если это строки, вы можете отсортировать их по сравнению. Разве они не струны? Не имеет значения, отсортированы ли они в JSON, когда вы преобразуете его в словарь, он больше не обязательно будет в порядке.
 01 мая 2012 г., 03:43
@SArumik - элементы в JSON-объекте & quot; (эквивалент NSDictionary)definition не заказано. Если они появляются по порядку в исходной строке JSON, это будет рассматриваться как чистое совпадение.
 S Arumik09 мая 2012 г., 07:33
@rdelmar - Спасибо, да, отсортированный массив дал мне отсортированный неизвестный ключ для раздела. Но я не могу понять, как получить содержимое внутри, которое соответствует отсортированному порядку ключей ... было бы здорово, если бы вы могли показать мне немного больше ... спасибо.

{
"categories": [
    "unknownCategoryName": [
        {
            "key1": "value1",
            "key2": "value2"
        }
    ],
    "unknownCategoryName2": [
        {
            "key1": "value1",
            "key2": "value2"
        }
    ]
]
}

И это очень легко отсортировать, если вы сделали, как указано выше.

To sort JSON provided in your question

-(NSMutableArray *)getAllKeys:(NSDictionary *)jsonDictionary{

       NSDictionary *all = [results objectForKey:@"categories"];
       NSMutableArray *allKeys = [all allKeys];
       NSSortDescriptor *sorter = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES];
       NSArray *sortDescriptors = [NSArray arrayWithObject: sorter]; 

       [allKeys sortUsingDescriptors:sortDescriptors]; 
       [sorter release];

       return allkeys;
   }

   -(void)createSortedDictionary{
        NSMutableDictionary *dictionaryMutable=[NSMutableDictionary dictionary];
        for(NSString *string in allkeys){

           [dictionaryMutable setObject:[all objectForKey:string] forKey:string];
        }
     }

dictionaryMutable будет держать отсортированный словарь

 S Arumik09 мая 2012 г., 07:39
спасибо, я мог бы заставить DictionaryMutable работать и показывать его по порядку в nslog, но как я могу получить данные внутри, которые будут отображаться по порядку в каждом разделе?

что единственный способ сохранить исходный порядок - это выполнить первоначальный анализ самостоятельно после создания строки JSON из данных JSON. Если структура строки JSON такая же, как вы отправили, вы можете использовать NSScanner, чтобы найти строки между кавычками, а затем выбрать только те, которые имеют [после последней кавычки, чтобы добавить в массив, который будет вашим заказом. массив ключей. Затем вы можете создать NSDictionary с помощью анализатора JSON и получить значения, просматривая упорядоченные ключи и отправляя их valueForKey :.

Ваш ответ на вопрос