Получение значений, когда NSDictionary содержит список

Мне передают словарь:

aDictionary

Когда я выхожу из системы, словарь имеет следующий формат:

{
 value1 = "subValue1 {label=value1, info1=, info2=}";
 value2 = "subValue2 {label=value2, info1=, info2=}";
 value3 = "subValue3 {label=value2, info1=, info2=}";
 }

Мне нужно перебрать словарь, а затем определить, есть ли значение для value3 -> subValue3 -> info2.

Я могу сделать первоначальную итерацию, и я могу сделать подсловарь строки:

"subValue3 {label=value2, info1=, info2=}"

Но когда я пытаюсь использовать его, скажем, чтобы получить количество ключей, я получаю -[subValue3 allKeys]: нераспознанный селектор отправлен экземпляру.

NSArray *keys;
int i, count;
id key, value;

keys = [aDictionary allKeys];
count = [keys count];
for (i = 0; i < count; i++)
{
    key = [keys objectAtIndex:i];
    value = [aDictionary objectForKey:key];
    NSLog (@"Key: %@ for value: %@", key, value);

    NSDictionary *subDictionary = [aDictionary objectForKey:key];
    if ([key isEqualToString:@"info2"]) {
        DLog(@"subDictioanry = %@", subDictionary);
        // Everything is fine up to here
        NSArray *keys2;
        int i2, count2;
        id key2, value2;

        keys2 = [subDictionary allKeys];
        count = [keys2 count];
        //
        // Right here I get "-[subValue3 allKeys]: unrecognized selector sent to instance"
        //
        for (i2 = 0; i2 < count2; i2++) {
            key2 = [keys2 objectAtIndex:i2];
            value = [subDictionary objectForKey:key];
            DLog (@"Key: %@ for value: %@", key2, value2);

            NSDictionary *subDictionary2 = [subDictionary objectForKey:key2];
            DLog(@"subDictionary2 = %@", subDictionary2);
        }
    }

Вопросы: я не уверен, каков формат этой второй группы значений ("subValue3 {label=value2, info1=, info2=}"). Это набор, массив, словарь? Как мне поместить эту группу в словарь (без сбоев в ключе (?) "subValue3"), чтобы я мог проверить, имеет ли ключ info2 какое-либо значение?

Отказ от ответственности: я знаю, что есть более эффективные способы перебора словаря, я просто пытаюсь быть максимально ясным. Я уверен, что мне не хватает чего-то базового, но я не вижу ответа в документах Apple по итерации или NSDictionary и не нахожу ничего о формате во второй группе. Спасибо!


person addzo    schedule 07.12.2012    source источник


Ответы (1)


прямо сейчас "subValue1 {label=value1, info1=, info2=}"; это NSString. Так что allKeys из NSString выйдет из строя.

На самом деле этот "subValue1 {label=value1, info1=, info2=}"; выглядит как действительный json. Я не думаю, что это допустимый JSON. Так думает даже jsonlint.com.

Это действительный json

{
    "subValue1": {
        "label": "value1",
        "info1": "",
        "info2": ""
    }
}

После того, как вы создадите json таким образом, используйте NSJSONSerialization для преобразования -

NSError *e = nil;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options: NSJSONReadingMutableContainers error: &e];

if (!jsonDict) 
{
  NSLog(@"Error parsing JSON: %@", e);
} else 
{
   for(NSDictionary *item in jsonDict) 
      NSLog(@"Item: %@", item);
}
person Srikar Appalaraju    schedule 07.12.2012
comment
Истинный. Но я не хочу проходить процесс преобразования его в JSON только для того, чтобы получить значение. Возможно, мне нужно просто разобрать его как строку. - person addzo; 07.12.2012
comment
если вы не хотите преобразовывать JSON, вы можете использовать регулярные выражения. - person Srikar Appalaraju; 07.12.2012