Разбор JSON - проблема с SBJsonParser - PullRequest
0 голосов
/ 28 октября 2011

В настоящее время у меня возникает странная проблема, связанная с анализом некоторого JSON при использовании SBJsonParser.

Теперь анализируемый JSON выглядит следующим образом.

[
   {
      "Company":{
         "id":"1",
         "company_name":null
      },
      "relations":{
         "store":[
            {
               "id":"1",
               "restaurant_name":"Dubai",
               "brief_description":null
            },
            {
               "id":"2",
               "restaurant_name":"Test2",
               "brief_description":null
            }
         ]
      }
   }
]

Я могу легко создать NSDictionary и заполнить его правильной информацией для Company узла (?).

Но моя проблема возникает, когда дело доходит до отношения и хранилище узлов.

 NSDictionary *relations = [object valueForKey:@"relations"];
 NSArray *multipleStores = [relations valueForKey:@"store"];
 NSLog(@"relations: %@", relations);

 for (NSDictionary *singleStore in multipleStores){

        NSLog(@"Single Store: %@", singleStore);

        [company grabStoreInformation:singleStore];

 }

Вот то, что возвращает NSLog выше.

 relations: (
    {
    store =         (
                    {
            "brief_description" = "<null>";
            id = 1;
            "restaurant_name" = Dubai;
        },
                    {
            "brief_description" = "<null>";
            id = 2;
            "restaurant_name" = Test2;
        }
    );
 }
)

Теперь это было бы хорошо, если бы не былоне для того, что происходило в NSLog.Кажется, что SingleStore на самом деле не получает отдельные узлы хранилища, а добавляет оба узла хранилища.

Single Store: (
    {
    "brief_description" = "<null>";
    id = 1;
    "restaurant_name" = Dubai;
    },
    {
    "brief_description" = "<null>";
    id = 2;
    "restaurant_name" = Test2;
    }
)

Проблема в том, что мне нужно, чтобы каждый узел хранилища был добавлен в NSMutableArray.Таким образом, NSDictionary будет затем добавлен в NSMutableArray и затем доступен в другом месте (для источника данных UITableView).

Любая помощь будет очень полезна для разделения узлов хранилища.

РЕДАКТИРОВАТЬ Как и просили, весь код для разбора:

        SBJsonParser *parser = [[SBJsonParser alloc] init];

        // parse the JSON string into an object - assuming [response asString] is a NSString of JSON data
        NSDictionary *object = [parser objectWithString:[response asString] error:nil];

        [parser release];

        NSDictionary *companyDetails = [object valueForKey:@"Company"];

        MACompany *company = [MACompany sharedMACompany];
        [company initWithDetails:companyDetails];

        NSDictionary *relations = [object valueForKey:@"relations"];
        NSArray *multipleStores = [relations valueForKey:@"store"];

        NSLog(@"relations: %@", relations);

        for (NSDictionary *singleStore in multipleStores){

            NSLog(@"Single Store: %@", singleStore);

            [company grabStoreInformation:singleStore];

        }

Как вы можете видеть, я полагаюсь на одноэлементный класс для копирования элементов JSON.Я не думаю, что это имеет отношение к тому, чего я пытаюсь достичь, когда речь заходит о том, как разделить словарь одного магазина.

1 Ответ

1 голос
/ 28 октября 2011

Во-первых, обратите внимание, что ваш элемент верхнего уровня - это массив, а не объект.Следовательно:

NSDictionary *object = [parser objectWithString:[response asString] error:nil];

должно быть:

NSArray *object = [parser objectWithString:[response asString] error:nil];

, и я бы использовал companies вместо object в качестве имени переменной.

Во-вторых, выдолжны быть осторожны при использовании -valueForKey:.При отправке в массив он возвращает другой массив , содержащий значения, соответствующие ключевому аргументу.Если вы не знакомы с кодированием значения ключа, используйте канонический метод в NSDictionary, чтобы вернуть объект, связанный с данным ключом: -objectForKey:.

Если бы вы использовали -objectForKey: вместо -valueForKey:,вы бы заметили эту структурную ошибку при запуске вашей программы.

С учетом этих двух моментов вы можете перемещаться по данным JSON следующим образом:

NSArray *companies = [parser objectWithString:[response asString] error:nil];
for (NSDictionary *company in companies) {
    NSDictionary *companyDetails = [company objectForKey:@"Company"];
    NSDictionary *relations = [company objectForKey:@"relations"];
    NSArray *stores = [relations objectForKey:@"store"];

    for (NSDictionary *store in stores) {
        NSString *restaurantName = [store objectForKey:@"restaurant_name"];
        …
    }

Я рекомендую прочитать этот другой вопрос наПереполнение стека: Разница valueforKey objectForKey и Руководство по программированию кодирования значения ключа перед использованием -valueForKey:.

...