Objective-C SBJSON: порядок массива json - PullRequest
1 голос
/ 21 сентября 2010

У меня есть приложение для iPhone, которое получает строку json с сервера и анализирует ее.Он содержит некоторые данные и, например.массив комментариев.Но я заметил, что порядок массива json не сохраняется, когда я анализирую его так:

    // parse response as json
SBJSON *jsonParser = [SBJSON new];
NSDictionary *jsonData = [jsonParser objectWithString:jsonResponse error:nil];

NSDictionary* tmpDict = [jsonData objectForKey:@"rows"];
NSLog(@"keys coming!");
NSArray* keys = [tmpDict allKeys];
for (int i = 0;i< [keys count]; i++) {
    NSLog([keys objectAtIndex:i]);
}

Структура Json:

    {
   "pagerInfo":{

      "page":"1",

      "rowsPerPage":15,

      "rowsCount":"100"

   },

   "rows":{

      "18545":{

         "id":"18545",

         "text":"comment 1"

      },

      "22464":{

         "id":"22464",

         "text":"comment 2"

      },

      "21069":{

         "id":"21069",

         "text":"comment 3"

      },

 … more items

   }

}
* 1008Кто-нибудь знает, как бороться с этой проблемой?Большое вам спасибо!

Ответы [ 2 ]

3 голосов
/ 21 сентября 2010

В вашем примере JSON нет массива, кроме словаря.А в словаре ключи по определению никак не упорядочены.Поэтому вам нужно либо изменить код, который генерирует JSON, чтобы действительно использовать массив, либо отсортировать массив ключей в вашем коде Какао, например, так:

NSArray *keys = [[tmpDict allKeys] sortedArrayUsingSelector: @selector(compare:)];

Используя этот отсортированный массив ключей, вы можете создатьновый массив с объектами в правильном порядке:

NSMutableArray *array = [NSMutableArray arrayWithCapacity: [keys count]];
for (NSString *key in keys) {
    [array addObject: [tmpDict objectForKey: key]];
}
0 голосов
/ 07 октября 2010

Cocoprogrmr,

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

for (NSDictionary *myKey in keys)
{
  NSLog(@"rows/text --> %@",  [[myKey objectForKey:@"rows"] objectForKey:@"text"]);
}

Это должно сделать это. Мой синтаксис там может быть не идеальным, но вы поняли.

Andy

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