парсинг JSON веб-сервиса на целевой массив - PullRequest
0 голосов
/ 12 ноября 2011

Я разрабатываю приложение для iphone, и у меня есть JSON от веб-службы, как показано ниже:

[
    {
        "0":"test_w",
        "assignment_title":"test_w",
        "1":"2011-11-02 04:02:00",
        "assignment_publishing_datetime":"2011-11-02 04:02:00",
        "2":"2011-11-02 01:53:00",
        "assignment_due_datetime":"2011-11-02 01:53:00",
        "3":"course_math.png",
        "course_icon":"course_math.png",
        "4":null,
        "submission_id":null
    },
    {
        "0":"\u062a\u0637\u0628\u064a\u0642 \u0631\u0642\u0645 3",
        "assignment_title":"\u062a\u0637\u0628\u064a\u0642 \u0631\u0642\u0645 3",
        "1":"2011-08-08 00:00:00",
        "assignment_publishing_datetime":"2011-08-08 00:00:00",
        "2":"2011-08-25 00:00:00",
        "assignment_due_datetime":"2011-08-25 00:00:00",
        "3":"course_math.png",
        "course_icon":"course_math.png",
        "4":null,
        "submission_id":null
    }
]

также у меня есть таблица и мне нужно анализировать assignment_title только для ячеек таблицы, также я использую библиотеку SBJSON.

так, как лучше всего извлечь assignment_title и поместить их в клетки?

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Я нахожу решение из ваших ответов, как показано ниже:

Я создал метод с 2 параметрами (json_path, field [то, что мне нужно показать в ячейке таблицы)]

- (NSMutableArray*)JSONPath:(NSString *)path JSONField:(NSString *)field{
    SBJSON *parser = [[SBJSON alloc] init];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]];
    // Perform request and get JSON back as a NSData object
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    // Get JSON as a NSString from NSData response
    NSString *json_string = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];

    NSArray *statuses = [parser objectWithString:json_string error:nil];

    NSMutableArray * tempMutArray = [[[NSMutableArray alloc] init] autorelease];
    int i;
    for (i=0; i<[statuses count]; i++) {
            [tempMutArray addObject:[[statuses objectAtIndex:i] objectForKey:field]];
    }

    return [tempMutArray copy];

}

после этого я вызываю его в ячейку следующим образом:

//in viewDidLoad
NSArray * homework = [self JSONPath:@"http://....." JSONField:@"assignment_title"];

//In cellForRowAtIndexPath
cell.textLabel.text = [homework objectAtIndex:indexPath.row];

Спасибо всем

0 голосов
/ 12 ноября 2011

Если производительность имеет значение, вы можете использовать ASIHTTPRequest для асинхронной выборки json, а затем внутри requestFinished: вы можете сделать что-то вроде:

- (void)requestFinished:(ASIHTTPRequest *)request
{
   // Use when fetching text data
   NSString *responseString = [request responseString];

   //assuming you created a property instance variable NSArray *myArrAssignmentTitles
   NSArray *tempArray = [responseString JSONValue];
   //making an array of assignment_title
   NSMutableArray *tempMutArray = [[NSMutableArray alloc] init];
   int i;
   for(i = 0;i < [tempArray count];i++){
       [tempMutArray addObject:[[tempArray objectAtIndex:i] objectForKey:@"assignment_title"]];
   }
   //assign the data to the instance variable NSArray *myArrAssignmentTitles
   self.myArrAssignmentTitles = tempMutArray;
   //release tempMutArray since the instance variable has it
   [tempMutArray release];

   //call the reload table
   [self.tableView reloadData];//i think this is how to reload the table
}

- (void)requestFailed:(ASIHTTPRequest *)request
{
    NSError *error = [request error];
}

Итак, ваши myArrAssignmentTitles имеют все значения assignment_title из json все, что вам нужно сделать, это просто применить данные массива для ячейки, например

  cell.textLabel.text = [self.myArrAssignmentTitles objectAtIndex:indexPath.row];

это длинный код, извините за это. Но это работает для меня XD; он извлекает json асинхронно, после чего создает массив assignment_title, надеясь, что это поможет.

0 голосов
/ 12 ноября 2011

Если вы делаете это через NSJSONSerialization, вы можете получить массив assignment_title, используя этот простой метод;)

NSError *error = nil;
NSData *jsonData = [NSData dataWithContentsOfURL:apiURL]; 
id jsonObjectFound = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];
NSArray* assignmentTitles = [jsonObjectFound valueForKey:@"assignment_title"];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...