Синтаксический анализ JSON возвращает ноль в iOS (строка json выглядит правильно) - PullRequest
0 голосов
/ 21 августа 2011

Я пытаюсь получить приложение JSON to iOS, но продолжаю получать значения NULL ..

</p> <pre><code>- (id)initWithDictionary:(NSDictionary *)dictionary { self.name = [dictionary valueForKey:@"name"]; self.amount = [NSString stringWithFormat:@"%@", [dictionary valueForKey:@"amount"]]; self.goalId = [dictionary valueForKey:@"id"]; self.createdAt = [dictionary valueForKey:@"created_at"]; self.updatedAt = [dictionary valueForKey:@"updated_at"]; return self; } + (NSArray *)findAllRemote { NSURL *url = [NSURL URLWithString:@"http://localhost:3000/goals.json"]; NSError *error = nil; NSString *jsonString = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; NSLog(@"my string = %@", jsonString); NSMutableArray *goals = [NSMutableArray array]; if (jsonString) { SBJSON *json = [[SBJSON alloc] init]; NSArray *results = [json objectWithString:jsonString error:&error]; [json release]; for (NSDictionary *dictionary in results) { Goal *goal = [[Goal alloc] initWithDictionary:dictionary]; [goals addObject:goal]; [goal release]; } } return goals; }

Строка JSON выглядит правильно:

my string = [{"goal": {"amount": "100.0", "creation_at": "2011-08-20T00: 55: 34Z", "id": 1, "name": "User" , "updated_at": "2011-08-20T00: 55: 34Z"}}, { "цель": { "количество": "200,0", "created_at": "2011-08-20T00: 56: 48Z",» идентификатор ": 2," название ":" Пользователь2" , "updated_at": "2011-08-20T00: 56: 48Z"}}, { "цель": { "количество": "19999,0", "created_at":» 2011-08-20T19: 15: 10Z "," id ": 3," name ":" Это МОЯ ЦЕЛЬ "," updated_at ":" 2011-08-20T19: 15: 10Z "}}, {" goal " : { "количество": "0,0", "created_at": "2011-08-20T20: 46: 44Z", "идентификатор": 4, "название": "цель", "updated_at": "2011-08-20T20 : 46: 44Z "}}]

Мне не хватает чего-то простого, я думаю ..

UPDATE

Вот строка, которая возвращает NULL (из другого класса):

- (IBAction)refresh {
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
self.goals = [Goal findAllRemote];
[self.tableView reloadData];
[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}

- (void)viewDidLoad
{
[super viewDidLoad];

self.title = @"Goals";
self.navigationItem.leftBarButtonItem = self.editButtonItem;

UIBarButtonItem *refreshButton = [[UIBarButtonItem alloc] 
                                      initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
                                  target:self 
                                  action:@selector(refresh)];
self.navigationItem.rightBarButtonItem = refreshButton;
[refreshButton release];

[self refresh];

}


 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


static NSString *CellIdentifier = @"GoalCellId";

UITableViewCell *cell = 
[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
                                   reuseIdentifier:CellIdentifier] autorelease];
}

Goal *goal = [goals objectAtIndex:indexPath.row];

cell.textLabel.text = goal.name;
cell.detailTextLabel.text = goal.amount;

return cell;
}

goal.name и goal.amount равны Null ..

1 Ответ

1 голос
/ 21 августа 2011

Возможно, это не является частью вашей проблемы, но вы должны звонить [self init] (или, что более важно, [super init] через наследование):

- (id)initWithDictionary:(NSDictionary *)dictionary {
    if (self = [self init]) {
      self.name      = [dictionary valueForKey:@"name"];
      self.amount    = [NSString stringWithFormat:@"%@", 
                      [dictionary valueForKey:@"amount"]];
      self.goalId    = [dictionary valueForKey:@"id"];
      self.createdAt = [dictionary valueForKey:@"created_at"];
      self.updatedAt = [dictionary valueForKey:@"updated_at"];
    }
    return self;
}

Также:

    for (NSDictionary *dictionary in results) {
       Goal *goal = [[Goal alloc] initWithDictionary:
          [dictionary objectForKey:@"goal"]];
       [goals addObject:goal];
       [goal release];
    }

Смена ключа [dictionary objectForKey:@"goal"] в строке 3.

Массив JSON состоит из объектов с одним членом goal со свойствами, которые ищет ваш метод initWithDictionary.

...