Как я могу перебрать и получить все значения в NSDictionary? - PullRequest
3 голосов
/ 10 ноября 2011

У меня проблема.

Я использую класс XMLReader для получения NSDictionary, и все работает отлично. Но я не могу получить значения атрибутов моего элемента productData.

В частности, у меня есть следующее NSDictionary:

{
response = {
  products = {
   productsData = (
    {
    alias = "Product 1";
    id = 01;
    price = "10";
    },
    {
    alias = "Product 2";
    id = 02;
    price = "20";
    },
    {
    alias = "Product 3";
    id = 03;
    price = "30";
  });
 };
};
}

Я использовал этот код для создания де NSDictionary:

NSDictionary *dictionary = [XMLReader dictionaryForXMLData:responseData error:&parseError];

и responseData содержит:

<application>
  <products>
    <productData>
      <id>01</id>
      <price>10</price>
      <alias>Product 1</alias>
    </productData>
    <productData>
      <id>02</id>
      <price>20</price>
      <alias>Product 2</alias>
    </productData>
    <productData>
      <id>02</id>
      <price>20</price>
      <alias>Product 3</alias>
    </productData>
  </products>
</application>

Тогда я не знаю, как получить значения каждого productData, такие как id, цена и псевдоним ...

Кто-нибудь знает, как это сделать ??

Спасибо и прости мой плохой английский!

Ответы [ 3 ]

22 голосов
/ 10 ноября 2011
NSArray* keys = [theDict allKeys];

for(NSString* key in keys) {
    id obj = [theDict objectForKey:key];

    // do what needed with obj
}

вы можете попробовать что-то вроде этого:

NSArray* keys = [theDict allKeys];

for(NSString* key in keys) {
    if ([key isEqualToString:@"product"]) {
    NSArray* arr = [theDict objectForKey:key];

    // do what needed with arr 
}
    }
4 голосов
/ 20 июня 2014

В NSDictionary - -allValues есть метод, который возвращает новый массив, содержащий значения словаря. Может быть, это поможет.

1 голос
/ 10 ноября 2011

Начиная с

NSDictionary *dictionary = [XMLReader dictionaryForXMLData:responseData error:&parseError];

, вы можете сделать что-то вроде этого:

NSDictionary *application = [dictionary objectForKey:@"application"];
if ([[application objectForKey:@"products"] isKindOfClass [NSArray class]]) {
    NSArray *products = [application objectForKey:@"products"];
    for (NSDictionary *aProduct in products) {
       // do something with the contents of the aProduct dictionary
    }
else if {[[application objectForKey:@"products"] isKindOfClass [NSDictionary class]]) {
    // you will have to see what the returned results look like if there is only one product 
    // that is not in an array, but something along these lines may be necessary
    // to get to a single product dictionary that is returned
}

У меня был похожий случай (синтаксический анализ JSON), когда массив не возвращался длязначение signle, поэтому результат должен быть проверен как для массива (словарей продуктов в вашем случае), так и для одного NSDictionary (словарь продуктов в вашем случае).

...