2016-10-20 2 views
0

Мне нужно разобрать json и получить пары значений ключа в той же последовательности, что и в ответе.Как последовательно разбирать NSDictionary?

В настоящее время, что я делаю это

-(instancetype)initWithJson:(NSDictionary *)responseDict { 
     if (self = [super init]){ 
      NSArray *tempArray = [[NSArray alloc] init]; 

      NSArray *roomSizesForAcArray = [responseDict valueFromDictionaryWithNSNullCheck:@"roomSizesForAc"]; 
      NSArray *loadChartForInverterArray = [responseDict valueFromDictionaryWithNSNullCheck:@"loadChartForInverter"]; 
      if(roomSizesForAcArray && roomSizesForAcArray.count>0){ 
       self.isInverterChart=false; 
       tempArray=roomSizesForAcArray; 
      } 
      else if(loadChartForInverterArray && loadChartForInverterArray.count>0){ 
       self.isInverterChart=true; 
       tempArray=loadChartForInverterArray; 
      } 
      self.arrayOfChartSizeObjects=tempArray; 

      if(tempArray && tempArray.count>0){ 

      //Temp array first object is a dictionary which i need to parse sequentially 

       self.arrayOfKeys = [[tempArray objectAtIndex:0] allKeys]; 

      //This array of keys is random every time and not sequential 
      } 
    } 
    return self; 
} 

Мне нужно разобрать некоторым образом словарь [tempArray objectAtIndex: 0], поддерживая порядок ключей в инициализации.

+0

Почему это имеет значение для вас в какой бы последовательности они ни были в вашем dict? Просто сделайте заказ, чтобы вы извлекли значения из dict, соответствующие вашим требованиям. – NSNoob

ответ

0

Непонятно, что вы хотите, вы хотите словарь, когда вы уже разбираете словарь. Чтобы получить словарь от JSON, используйте код ниже.

NSError* error; 
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:receiveData options:kNilOptions error:&error]; 

Чтобы получить все ключи, а затем извлекать детали использовать

NSArray *sortedKeys = [[jsonDict allKeys] 

После того, как у вас есть ключи, то получить детали

+0

NSJonSerialization преобразует json в объект как nsaaray или nsdictionary, но теперь как вы будете разбирать этот словарь поочередно. Словарь не поддерживает заказы. –

+0

** ** Оставшийся товар не поддерживается **. Как в какао, так и в JSON словари ** неупорядочены **. Порядок, в котором пары ключ/значение словаря поступает с сервера, не определен. –

+0

@ Duncan C спасибо за снятие сомнений –

0
NSError *e = nil; 
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: &e]; 

if (!jsonArray) { 
    NSLog(@"Error parsing JSON: %@", e); 
} else { 
    for(NSDictionary *item in jsonArray) { 
     NSLog(@"Item: %@", item); 
    } 
} 
+0

На первой итерации первый словарь, который вы получаете в пункте, как будет итерировать этот словарь, последовательно сохраняя свой порядок для ключей. –

0

Словари являются неупорядоченные коллекции. Вы говорите «... поддерживая порядок ключей в init». Такого нет.

JSON «Объекты», эквивалент JSON словарей NSDictionaries/Swift, имеют одинаковую проблему.

Некоторые библиотеки JSON сохраняют порядок отправки пар ключ/значение, но вы не должны зависеть от этого. Протокол JSON не гарантирует этого.

После получения данных JSON и преобразования его в NSDictionary/Dictionary, порядок отправки пар ключ/значение теряется. Единственный способ сохранить (уже ненадежный) порядок пар ключ/значение из исходного потока данных JSON состоит в том, чтобы самостоятельно проанализировать JSON, а не десериализовать его, используя NSJSONSerialization.

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

+0

Хорошо спасибо за очищение моего сомнения, я не был уверен, что преобразование json-данных в словарь ns потеряет порядок ключей. –

+0

Опять же, для словарей порядок не определен. Некоторые реализации сервера могут сохранять порядок, в котором отправляются объекты JSON, а некоторые - нет. Ключевым выводом здесь является то, что словари являются ** НЕПОСРЕДСТВЕННЫМИ КОЛЛЕКЦИЯМИ **. –

+0

Я дал вам правильный ответ на ваш вопрос. Вы должны принять мой ответ. –

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