【问题标题】:How to parse NSDictionary sequentially?如何按顺序解析 NSDictionary?
【发布时间】:2017-03-02 08:15:00
【问题描述】:

我需要解析一个 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 && 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 中键的顺序。

【问题讨论】:

  • 为什么它们在你的字典中的顺序对你很重要?只需使您从 dict 中提取值的顺序符合您的要求。

标签: ios json nsdictionary


【解决方案1】:

不清楚你想要什么,你在解析字典时想要字典。要从 JSON 中获取字典,请使用以下代码。

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

要获取所有密钥,然后检索详细信息,请使用

NSArray *sortedKeys = [[jsonDict allKeys]

一旦你有钥匙,然后获取详细信息

【讨论】:

  • NSJonSerialization 会将 json 转换为像 nsaaray 或 nsdictionary 这样的对象,但现在你将如何串行解析这个字典。字典不维护那里的订单。
  • 没有没有订单要保留。在 Cocoa 和 JSON 中,字典都是无序的。字典的键/值对从服务器到达的顺序是不确定的。
【解决方案2】:
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);
   }
}

【讨论】:

  • 在第一次迭代时,你在项目中获得的第一个字典,你将如何迭代该字典以保持其键的顺序。
【解决方案3】:

字典是无序的集合。您说“...维护 init 中键的顺序”。没有这样的东西。

JSON“对象”,相当于 NSDictionaries/Swift 字典的 JSON,也有同样的问题。

一些 JSON 库会保留键/值对提交发送的顺序,但您不应依赖此顺序。 JSON协议不保证。

一旦您收到 JSON 数据并将其转换为 NSDictionary/Dictionary,键/值对的发送顺序就会丢失。我知道从原始 JSON 数据流中保留键/值对的(已经不可靠的)顺序的唯一方法是自己解析 JSON,而不是使用 NSJSONSerialization 反序列化它。

如果您希望数据按特定顺序排列,您应该使用数组作为容器对象来发送它。如果需要,您可以发送一组键/值对。

【讨论】:

  • 好的,感谢您消除我的疑问,我不确定将 json 数据转换为 ns 字典会丢失键的顺序。
  • 再次,对于字典,顺序是未定义的。一些服务器实现可能会保留 JSON 对象的发送顺序,而另一些可能不会。这里的关键点是字典是UNORDERED COLLECTIONS
  • 我已经给了你问题的正确答案。你应该接受我的回答。
猜你喜欢
  • 2018-09-22
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2012-06-23
相关资源
最近更新 更多