разбирать значение из словаря / списка - PullRequest
1 голос
/ 04 февраля 2011

У меня есть словарь / список balance_sign_dict, из которого мне нужно получить 2 значения в зависимости от условия. Исходный XML для этого:

<Value>
<Signature>-873</Signature>
<Amount>1501042000</Amount>
</Value>

Я хочу проанализировать данные из указания, показанного ниже; Подскажите, пожалуйста, как мне разобрать условные данные (например, если я хочу, чтобы значение узла "Сумма" для узла "Подпись" имело -873), то есть оно должно вернуть мне 1501042000

Я хочу общий способ анализа значений из словаря ниже.

Печатное описание balance_sign_dict:

(
        {
        nodeChildArray =         (
                        {
                nodeContent = "-873";
                nodeName = Signature;
            },
                        {
                nodeContent = 1501042000;
                nodeName = Amount;
            }
        );
        nodeName = Value;
    },
        {
        nodeChildArray =         (
                        {
                nodeContent = "-1228";
                nodeName = Signature;
            },
                        {
                nodeContent = 428586000;
                nodeName = Amount;
            }
        );
        nodeName = Value;
    },
        {
        nodeChildArray =         (
                        {
                nodeContent = "-1140";
                nodeName = Signature;
            },
                        {
                nodeContent = 79370000;
                nodeName = Amount;
            }
        );
        nodeName = Value;
    },

Вот то, что я сейчас пытаюсь;

for (NSDictionary *valueNode in balance_sign_dict){
            for (NSArray *nodeChildArray in [valueNode objectForKey:@"nodeChildArray"]){
                NSString *tmpNodeName = [nodeChildArray objectAtIndex:1];
                NSDictionary *tmpD = [valueNode objectAtIndex:1];


                if ([tmpNodeName isEqualToString:@"Signature"]) {
                    tmpSignVal = [nodeChildArray objectAtIndex:0];
                    if ([tmpSignVal isEqualToString:@"-873"]) {
                        tmpSignAmt = [nodeChildArray objectAtIndex:1];
                    }
                }

Но по какой-то причине 2-я часть nodeChildArray удаляется ... т.е. nodeContent = 1501042000; имя_узла = сумма;

Я не уверен, как получить доступ к этой части.

Пожалуйста, помогите. }
}

На самом деле вот что я получаю во время альтернативных пробежек;

Распечатка описания nodeChildArray: {type = изменяемый dict, count = 2, записи => 0: {contents = "nodeName"} = {contents = "Подпись"} 1: {contents = "nodeContent"} = {contents = "-1507"} }

Распечатка описания nodeChildArray: {type = изменяемый dict, count = 2, записи => 0: {contents = "nodeName"} = {contents = "Amount"} 1: {contents = "nodeContent"} = {contents = "631000"} }

Как получить значение Amount для соответствующего значения Signature?

1 Ответ

1 голос
/ 04 февраля 2011

NSArray и NSDictionary - лучшие контейнерные классы, которые я знаю на любом языке, с которым у меня есть опыт работы. NSDictionary может хранить любой объект или примитив, включая NSArray, и наоборот. Когда я говорю словарь, я произвольно имею в виду любой класс.

Когда вы выводите описание любого словаря (который так прост, как NSLog(@"%@",myDict);), все содержимое словаря отображается как документ XML (или, точнее, JSON). Это легко увидеть из словарного описания, чтобы определить, что содержится внутри. () обозначает NSArray, а {} обозначает NSDictionary.

// this is the beginning of an array.
(
        // this is the beginning of index 0 of the array, an `NSDictionary`
        {
        // objectForKey:@"nodeChildArray"] isKindOfClass:[NSArray class]]
        nodeChildArray =         ( // inside nodeChildArray is another array
                        { // index 0 of array is a dictionary with two keys
                // objectForKey:@"nodeContent" == @"-873"
                nodeContent = "-873";
                // objectForKey:@"nodeName" == @"Signature"
                nodeName = Signature;
            }, // end of index 0
                        { // index 1 of array
                nodeContent = 1501042000;
                nodeName = Amount;
            } // end of index 1
        ); // end of nodeChildArray, an NSArray stored at objectForKey:@"nodeChildArray"
        // this is the only other element in the dictionary, a string
        // objectForKey:@"nodeName"] isKindOfClass:[NSString class]]
        nodeName = Value;
    }, // end of the dictionary containing nodeChildArray and nodeName
        { // objectAtIndex:1
        nodeChildArray =         (
                        {
                nodeContent = "-1228";
                nodeName = Signature;
            },
                        {
                nodeContent = 428586000;
                nodeName = Amount;
            }
        );
        nodeName = Value;
    },
        { // objectAtIndex:2
        nodeChildArray =         (
                        {
                nodeContent = "-1140";
                nodeName = Signature;
            },
                        {
                nodeContent = 79370000;
                nodeName = Amount;
            }
        );
        nodeName = Value;
    },
);

Таким образом, по выводу отладочной информации NSDictionary видно, что на самом деле это NSArray. Порядок структур NSArray->NSDictionary->NSArray->NSString <--> [[[[NSArray objectAtIndex:i] NSDictionary objectForKey:@"nodeChildArray"] NSArray objectAtIndex:j] NSDictionary objectForKey:@"nodeContent"], в конечном итоге возвращает NSString. Используйте это как самый последний код - в последней версии кода я передал balance_sign_dict как NSDictionary. Это могло бы даже сработать! Но гораздо лучше правильно привести аргумент. Если вы не знаете, будет ли ваш словарь начинаться с NSArray или NSDictionary, вы можете привести его к типу id и проверить его тип с помощью [theIdObject isKindOfClass:[{NSArray,NSDictionary} class]]. Не используйте {} и выберите один из двух символов в своем коде.

-(NSDictionary*)parseBalance:(NSArray*)balance_sign_dict
{
  NSMutableDictionary* theResults = [NSMutableDictionary dictionary];
  for( NSDictionary* nodeDict in balance_sign_dict )
  {
    NSArray* nodeChildArray = [nodeDict objectForKey:@"nodeChildArray"];
    [theResults addObject:[[nodeChildArray objectAtIndex:1] objectForKey:@"nodeContent"] forKey:[[nodeChildArray objectAtIndex:0] objectForKey:@"nodeContent"]];
  }
  return theResults;
}
...