#ios #json #nsdictionary
#iOS #json #nsdictionary
Вопрос:
Мне нужно проанализировать json и получить пары ключ-значение в той же последовательности, в какой они присутствуют в ответе.
В настоящее время то, что я делаю, это
-(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 amp;amp; roomSizesForAcArray.count>0){
self.isInverterChart=false;
tempArray=roomSizesForAcArray;
}
else if(loadChartForInverterArray amp;amp; loadChartForInverterArray.count>0){
self.isInverterChart=true;
tempArray=loadChartForInverterArray;
}
self.arrayOfChartSizeObjects=tempArray;
if(tempArray amp;amp; 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], сохраняя порядок ключей в инициализации.
Комментарии:
1. Почему для вас имеет значение, в какой последовательности они находятся в вашем dict? Просто сделайте так, чтобы порядок извлечения значений из dict соответствовал вашим требованиям.
Ответ №1:
Не ясно, что вы хотите, вам нужен словарь, когда вы уже анализируете словарь. Чтобы получить словарь из JSON, используйте приведенный ниже код.
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:receiveData options:kNilOptions error:amp;error];
Чтобы получить все ключи, а затем получить детали, используйте
NSArray *sortedKeys = [[jsonDict allKeys]
Как только у вас будут ключи, получите детали
Комментарии:
1. NSJonSerialization преобразует json в объект, подобный nsaaray или nsdictionary, но теперь, как вы будете последовательно анализировать этот словарь. Словарь не поддерживает там порядок.
2. Нет порядка, который нужно сохранить . Как в Cocoa, так и в JSON словари неупорядочены . Порядок, в котором пары ключ / значение словаря поступают с сервера, не определен.
Ответ №2:
NSError *e = nil;
NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: data options: NSJSONReadingMutableContainers error: amp;e];
if (!jsonArray) {
NSLog(@"Error parsing JSON: %@", e);
} else {
for(NSDictionary *item in jsonArray) {
NSLog(@"Item: %@", item);
}
}
Комментарии:
1. На первой итерации первого словаря, который вы получаете в item, как вы будете последовательно повторять этот словарь, сохраняя его порядок для ключей.
Ответ №3:
Словари представляют собой неупорядоченные коллекции. Вы говорите «… поддержание порядка ключей в инициализации». Такого понятия не существует.
JSON «Объекты», эквивалент JSON словарей NSDictionary / Swift, имеют ту же проблему.
Некоторые библиотеки JSON сохранят порядок, в котором отправляются пары ключ / значение, но вы не должны зависеть от этого. Протокол JSON этого не гарантирует.
Как только вы получаете данные JSON и преобразуете их в NSDictionary
/ Dictionary
, порядок, в котором отправляются пары ключ / значение, теряется. Единственный известный мне способ сохранить (и без того ненадежный) порядок пар ключ / значение из исходного потока данных JSON — это самостоятельно проанализировать JSON, а не десериализовать его с помощью NSJSONSerialization
.
Если вы хотите, чтобы ваши данные находились в определенном порядке, вы должны использовать массив в качестве объекта контейнера для их отправки. При необходимости вы можете отправить массив пар ключ / значение.
Комментарии:
1. Хорошо, спасибо, что развеяли мои сомнения, я не был уверен, что преобразование данных json в словарь ns приводит к потере порядка ключей.
2. Опять же, для словарей порядок не определен. Некоторые серверные реализации могут сохранять порядок отправки объектов JSON, а некоторые — нет. Ключевым выводом здесь является то, что словари представляют собой НЕУПОРЯДОЧЕННЫЕ КОЛЛЕКЦИИ .
3. Я дал вам правильный ответ на ваш вопрос. Вы должны принять мой ответ.