Перемещение данных JSON в приложении iPhone - PullRequest
1 голос
/ 19 октября 2010

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

Я пытаюсь прочитать подробности со страницы JSON в Интернете (например, из каталога локальных сервисов) и установил библиотеку JSON в XCode, и, похоже, она работает нормально. Кстати, я разрабатываю для iPhone, и у меня установлены все последние версии.

Проблема в том, что из-за того, что я новичок и все такое, мне кажется, что я не могу получить всю необходимую мне информацию из файла JSON.

данные JSON, с которыми я тестирую, таковы:

"testlocal_response" =     {
        header =         {
            query =             {
                business = newsagent;
                location = brighton;
                page = 1;
                "per_page" = 1;
                "query_path" = "business/index";
            };
            status = ok;
        };
        records =         (
                        {
                address1 = "749 Rwlqsmuwgj Jcyv";
                address2 = "<null>";
                "average_rating" = 0;
                "business_id" = 4361366;
                "business_keywords" = "<null>";
                "business_name" = "Gloucester Newsagents";
                "data_provider_id" = "<null>";
                "display_details" = "<null>";
                "distance_in_miles" = "0.08";
                fax = "<null>";
                gridx = "169026.3";
                gridy = "643455.7";
                "image_url" = "<null>";
                latitude = "50.82718";
                "logo_path" = Deprecated;
                longitude = "-0.13963";
                phone = 97204438976;
                postcode = "IY1 6CC";
                "reviews_count" = 0;
                "short_description" = "<null>";
                "touch_url" = "http://www.test.com/business/list/bid/4361366";
                town = BRIGHTON;
                url = "<null>";
            }
        );
    };
}

Теперь, на моей странице ViewController.m кода, в области 'connectionDidFinishLoading' я добавил:

  NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
 [responseData release];

 // make sure JSON has all been pulled in
        NSLog(@"This is from the JSON page:\n");
 NSLog(responseString);
 NSError *error;
 SBJSON *json = [[SBJSON new] autorelease];

        // using either of these seems to make no difference?
 NSDictionary *touchDirect = [json objectWithString:responseString error:&error];
 //NSArray *touchDirect = [json objectWithString:responseString error:&error];
 [responseString release]; 

 if (touchDirect == nil)
  label.text = [NSString stringWithFormat:@"JSON parsing failed: %@", [error localizedDescription]];
 else {  
  NSMutableString *text = [NSMutableString stringWithString:@"Test directory details:\n"];

  [text appendFormat:@"%@\n", [[[[touchDirect objectForKey:@"testlocal_response"] objectForKey:@"header"] objectForKey:@"query"] objectForKey:@"business"]];

  label.text =  text;

Проверяя это, я получаю возвращаемое значение для бизнеса («газетный киоск») или правильное местоположение («брайтон»). Моя проблема в том, что я не могу идти дальше в JSON. Я не знаю, как вытащить результат для фактических «записей», которые в тестовом примере содержат только одну из них, но их можно разделить с помощью скобок «(» и «)».

Как только я пытаюсь получить доступ к данным в этих областях записи (например, «address1» или «latitude» или «postcode»), происходит сбой и появляется сообщение «нераспознанный селектор отправлен на экземпляр»

ПОЖАЛУЙСТА, кто-нибудь может сказать мне, что я делаю неправильно ?! Я пробовал так много разных вещей и просто не могу дальше! Я читал в Интернете разные вещи, но, похоже, мне ничего не помогло.

Любые ответы высоко ценятся. Я также опубликовал вопрос на iPhone SDK, но пока не получил полезного ответа.

большое спасибо,

-Robsa

Ответы [ 2 ]

0 голосов
/ 19 октября 2010

Ну, я наконец разобрался!Я поместил записи в строку NSString, к которой я затем мог получить доступ, используя objectAtIndex.Вот основной код Viewcontroller.m для него:

- (void)viewDidLoad {   
    [super viewDidLoad];

    responseData = [[NSMutableData data] retain];       
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"*URL TO JSON DATA HERE*"]];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];               
    NSMutableArray *touchDirect = [json objectWithString:responseString error:&error]; 
    NSString *touchRecord = [[touchDirect objectForKey:@"touchlocal_response"] objectForKey:@"records"];

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    [responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    label.text = [NSString stringWithFormat:@"Connection failed: %@", [error description]];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {      
    [connection release];

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    [responseData release];
    NSError *error;
    SBJSON *json = [[SBJSON new] autorelease];
    //Retrieves the JSON header Data, returning info such as 'status' [which should return 'ok']
    NSMutableArray *touchDirect = [json objectWithString:responseString error:&error]; 
    //Puts the records returned into a string called touchRecord
    NSString *touchRecord = [[touchDirect objectForKey:@"touchlocal_response"] objectForKey:@"records"];
    [responseString release];   

    // test results   
    [text appendFormat:@" Address: %@\n", [[touchRecord objectAtIndex:0] objectForKey:@"address1"]];
    [text appendFormat:@" Phone:   %@\n", [[touchRecord objectAtIndex:0] objectForKey:@"phone"]];
    [text appendFormat:@" Address Data record 2: %@\n", [[touchRecord objectAtIndex:1] objectForKey:@"address1"]];
    [text appendFormat:@" Phone Data record 2:   %@\n", [[touchRecord objectAtIndex:1] objectForKey:@"phone"]];

Кажется, теперь это работает нормально.У меня также есть оператор if..else if для отлова ошибок сейчас.Этот код выглядит хорошо?

Спасибо за подсказку, Ник - я просто пытался получить вывод прямо перед тем, как привести код в порядок.Я использую NSMutableArray для первоначальной установки JSON, это нормально?Какая польза от помещения его в NSDictionary?

привет,

Робса

0 голосов
/ 19 октября 2010

Вы подтвердили свой JSON?

Непонятно, как вы пытаетесь получить доступ к объектам, которые, по вашему мнению, являются ошибочными. Определенные строки, с которыми у вас возникли проблемы, были бы полезны.

Обычно легче установить указатель на словарь, к которому вы собираетесь обращаться для удобства чтения.

NSDictionary *records = [[objectForKey:@"testlocal_response"] objectForKey@"records"];

тогда ...

NSString *businessName = [records objectForKey:@"business_name"];
float latitude = [[records objectForKey:@"latitude"] floatValue];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...