php -> JSON -> iPhone - PullRequest
       6

php -> JSON -> iPhone

2 голосов
/ 14 июля 2011

У меня есть приложение для iPhone, которое отправляет запрос URL-адресу, публикующему переменную submit:

+(NSMutableArray*)getQuestions:(NSString*)section from: (NSString*) url{
    NSMutableArray *questions = [[NSMutableArray alloc] init];
    //connect to database given by url
    //NSError        *error = nil;
    //NSURLResponse  *response = nil;
    NSMutableString* myRequestString = [[NSMutableString string]initWithFormat:@"section=%@", section];
    NSData *myRequestData = [NSData dataWithBytes: [myRequestString UTF8String] length: [myRequestString length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: [NSURL URLWithString: url]]; 
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
    [request setHTTPMethod: @"POST"];
    //post section 
    [request setHTTPBody: myRequestData];

    //store them in the array;
    return [questions autorelease];
}

Мой файл php:

<?php

//connect to database
function connect() {
  $dbh = mysql_connect ("localhost", "abc1", "12345") or die ('I cannot connect to the database because: ' . mysql_error());
  mysql_select_db("PDS", $dbh); 
  return $dbh;
}

//store posted data
if(isset($_POST['section'])){
  $dbh = connect();
  $section = $_POST['section'];
  $query = mysql_query("SELECT * FROM QUESTIONS WHERE sectionId = $section;") or die("Error: " . mysql_error());;

  $rows = array();
  while($r = mysql_fetch_assoc($query)) {
    $rows[] = $r;
  }
  echo '{"questions":'.json_encode($rows).'}';
  mysql_close();
}
?>

Я создал класс модели (Вопрос) в задаче c, которая имеет точные свойства, которые каждый элемент строки имеет в массиве ассоциаций строк.

Мои вопросы:

1) Как я могу прочитать элементы массива echo'd JSON и их относительные атрибуты в задаче C?

2) Как я могу создать массив объектов Вопроса и сопоставить каждый из них с элементом в массиве строк?

3) Что мне нужно написать в моем методе "+ (NSMutableArray *) getQuestions: (NSString *) url из: (NSString *) url", чтобы получить ответ от php (эхо)?

РЕДАКТИРОВАТЬ:

Вот вывод php:

http://dev.speechlink.co.uk/David/get_questionstest.php

UPDATE

Изменен метод для использования ASIHTTPRequest -Невозможно десериализовать строку JSON:

//method to 
+(NSDictionary*)getQuestions:(NSString*)sectionId from: (NSString*) url{
    NSDictionary *questions;
    NSURL *link = [NSURL URLWithString:url];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:link];
    [request setPostValue:sectionId forKey:@"section"];
    NSError *error = [request error];
    [request startAsynchronous];

    if (!error) {       
        //NSString *response = [request responseString];
        //store them in the dictionary
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
        NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        questions = [json objectFromJSONString];
        NSLog(@"Data: %@", questions); //outputs Data: (null)
        [json release];
        [request release];      
    }else{
        //UIAlertView to warn users there was an error
    }               

    return questions;   
}

Ответы [ 2 ]

4 голосов
/ 14 июля 2011

Хорошо, давайте пройдем этот шаг за раз.

Вы можете легко создать NSDictionary из JSON, используя одну из нескольких различных библиотек анализа JSON. Мне действительно нравится использовать JSONKit . После того, как вы импортировали JSONKit в свой проект, вы можете сделать что-то вроде этого:

NSString *url = @"http://dev.speechlink.co.uk/David/get_questionstest.php";
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSString *json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSDictionary *questions = [json objectFromJSONString];
[json release];

Теперь у вас есть массив, заполненный вопросами в вашем примере. Теперь вы можете перебрать этот массив и заполнить ваши данные данными в массиве. Теперь давайте будем практичными. Было бы проще, если бы вам просто пришлось управлять одним объектом вместо четырех для каждого вопроса, не так ли? Давайте создадим класс, который содержит один вопрос на каждый экземпляр.


Интерфейс:

@interface Question : NSObject {
    NSString *questionId;
    NSString *question;
    NSString *questionNumber;
    NSString *sectionId;
}
@property(copy)NSString *questionID; 
@property(copy)NSString *question; 
@property(copy)NSString *questionNumber; 
@property(copy)NSString *sectionId; 

@end

И реализация:

@implementation Question
@synthesize questionId, question, questionNumber, sectionID;

@end

Теперь это просто базовый пример. Ничего фантастического. Теперь вы можете перебирать массив, который у вас был ранее, и создавать объекты «вопросов», которые содержат данные каждого вопроса. Для моих целей предположим, что у вас есть NSMutableArray с именем questionsArray, который содержит вопросы, которые вы хотите использовать. Мы пройдемся по словарю и добавим вопросы из словаря в массив questionsArray.

for (NSDictionary *q in questions) {
    /* Create our Question object and populate it */
    Question *question = [[Question alloc]init];
    question.questionId = [q objectForKey:@"questionId"];
    question.question = [q objectForKey:@"question"];
    question.questionNumber = [q objectForKey:@"questionNumber"];
    question.sectionId = [q objectForKey:@"sectionId"];

    /* Add it to our question (mutable) array */
    [questionsArray addObject:question];
    [question release];
}

Тад! Теперь у вас есть массив, заполненный Question объектами. В любое время, когда вы захотите просмотреть свойство любого из объектов вопроса, вы можете просто получить доступ к этому свойству. Например, чтобы получить номер первого вопроса, вы можете просто сделать это:

NSString *q1Number = [questionsArray objectAtIndex:0].questionNumber;

Обратите внимание, что все это не проверено, так как у меня нет моего компилятора. Это должно помочь вам начать. =) * * Тысяча тридцать одна


Редактировать: Вы выполняли свой запрос совершенно неправильно. Попробуйте это:

+(NSDictionary*)getQuestions:(NSString*)sectionId from: (NSString*) url{
    NSDictionary *questions = nil;
    NSURL *link = [NSURL URLWithString:url];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:link];
    [request setPostValue:sectionId forKey:@"section"];
    NSError *error = [request error];
    [request startSynchronous];

    if (!error) { 
        NSData *response = [request responseData];
        NSString *json = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
        questions = [json objectFromJSONString];
        [json release];
    } else{
        //UIAlertView to warn users there was an error
    }               
    [request release];
     return questions;
1 голос
/ 14 июля 2011

Посмотрите на отличный JSON-анализатор Стига Браутасета на GitHub .

А еще есть несколько примеров проектов.

От вашего PHP можно ожидать, что парсер будет производить и массив объектов NSDictionary. Я не уверен, что вы подразумеваете под вопросом 2, но затем вы можете перебирать массив и создавать собственные объекты «Вопрос» со значениями NSDictionary.

Надеюсь, это поможет.

Не видел, чтобы вы добавили третий вопрос. Ответ дан в примере выше «TweetStream». Я бы предложил использовать методы NSURLConnectionDelegate, как описано в Apple .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...