Поиск объекта во вложенном NSDictionary, когда родительский ключ неизвестен? - PullRequest
3 голосов
/ 17 декабря 2009

Я использую библиотеку yajl_JSON для создания NSDictionary из ответа JSON для службы сокращения URL bit.ly.

Ответ JSON:

{
  errorCode = 0;
  errorMessage = "";
  results = {
      "http://www.example.com/" = {
          hash = 4H5keM;
          shortKeywordUrl = "";
          shortUrl = "http://bit.ly/4BN4qV";
          userHash = 4BN4qV;
      };
  };
  statusCode = OK;
}

Чтобы уточнить, "http://example.com" не является дочерним" результатом ". И при разборе у меня есть 3 три вложенных NSDictionaries.

Проблема в том, что "http://example.com" - произвольный ключ. Я хочу получить доступ к данным ключа, не зная ключа. В частности, поэтому я могу получить значение для" shortUrl ". Как это можно сделать эффективно? Есть ли способ сделать keyPath, который будет выглядеть так:

"results.*.shortUrl"

Я выполнил это, выполнив следующее, но я предполагаю, что это не так, как это делается:

 // Parse the JSON responce
 NSDictionary *jsonResponce = [data yajl_JSON];

 // Find the missing key
 NSString *missingKey = [[[jsonResponce valueForKeyPath:@"results"] allKeys] objectAtIndex:0];

 // Log the value for "shortURL"
 NSLog(@"It is : %@", [[[jsonResponce objectForKey:@"results"] valueForKeyPath:missingKey] objectForKey:@"shortUrl"]);

Если бы я использовал XML, это было бы просто сделать, что заставило меня поверить, что я не использую json / target-c правильно.

Я знаю, что было бы возможно сохранить "example.com" в этой ситуации, когда я сделаю запрос к Bit.ly, но ... было бы хорошо знать в будущем ...

Спасибо.

Ответы [ 2 ]

4 голосов
/ 17 декабря 2009

Метод NSDictionary allValues возвращает массив значений в словаре, не привязанный к их ключам, а Кодировка значения ключа для NSArrays создает массив значения данного ключа для всех элементов в массив. Таким образом, вы можете сделать [[jsonResponse valueForKeyPath:@"results.allValues.shortURL"] objectAtIndex:0], чтобы получить shortURL.

3 голосов
/ 17 декабря 2009

Предполагая, что у вас есть NSDictionary results = [jsonResponce objectForKey:@"results], который является этой частью словаря:

{
    "http://www.example.com/" = {
          hash = 4H5keM;
          shortKeywordUrl = "";
          shortUrl = "http://bit.ly/4BN4qV";
          userHash = 4BN4qV;
    };
};

Вы можете перебрать все ключи в словаре:

NSString *shortURL = null;
for (id key in results) {
    NSDictionary* resultDict = [results objectForKey:key];
    shortURL = [resultDict objectForKey:@"shortURL"];
    NSLog(@"url: %@ shortURL: %@", key, shortURL);
}

Или выможно просто получить все значения в словаре и вытащить первое:

NSDictionary* resultDict = [[results allValues] objectAtIndex:0];
NSString *shortURL = [resultDict objectForKey:@"shortURL"];

. Или, если вам нужен длинный URL-адрес, используйте allKeys:

NSString *url = [[results allKeys] objectAtIndex:0]
NSDictionary* resultDict = [results objectForKey:url];
NSString *shortURL = [resultDict objectForKey:@"shortURL"];

(Примечание.что вы на самом деле должны проверить длину массивов, возвращаемых allKeys и allValues.)

...