2016-10-20 100 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]保持INIT鍵的順序。

+0

爲什麼它在你的字典中的順序無關緊要?只需按照您的要求提取字典中的值即可。 – NSNoob

回答

0

不清楚你想要什麼,你想要字典,而你已經解析字典。要從JSON獲取字典,請使用以下代碼。

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

爲了讓所有的鍵,然後檢索細節使用

NSArray *sortedKeys = [[jsonDict allKeys] 

一旦你有鑰匙,然後拿到細節

+0

NSJonSerialization會將json轉換爲像nsaaray或nsdictionary這樣的對象,但是現在你將如何連續地解析這個字典。 Dictionary不維護那裏的訂單。 –

+0

有**無法保存**。在Cocoa和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「Objects」,與NSDictionaries/Swift Dictionaries相當的JSON,具有相同的問題。

某些JSON庫將保留鍵/值對被提交發送的順序,但不應該依賴於此。 JSON協議不保證它。

一旦您收到JSON數據並將其轉換爲NSDictionary/Dictionary,鍵/值對的發送順序就會丟失。我知道保留原始JSON數據流中鍵/值對的(已經不可靠)順序的唯一方法是自己解析JSON,而不是使用NSJSONSerialization進行反序列化。

如果您希望以特定順序存儲數據,則應該使用數組作爲容器對象來發送它。如果需要,您可以發送一組鍵/值對。

+0

好的感謝清除我的疑問,我不確定將json數據轉換爲ns字典失去了鍵的順序。 –

+0

同樣,對於字典,訂單是不確定的。某些服務器實現可能會保留髮送JSON對象的順序,有些可能不會。這裏關鍵的是,字典是**無限集合**。 –

+0

我已經給你正確的答案給你的問題。你應該接受我的答案。 –