2011-08-21 66 views
0

我想获得一个JSON到iOS应用程序,但不断收到NULL值..JSON解析返回NULL的iOS(JSON字符串看起来是正确的)

- (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”,“created_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”, “ID” :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 “}},{” 目标 “:{” 量 “:” 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.namegoal.amount是空..

+0

什么是作为NULL返回? –

回答

1

这可能不是你的问题的一部分,但你应该叫[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方法正在查找的属性。

+0

这完全工作!非常感谢!!和btw ..当我添加if(self = [self init])行时,我得到这个警告:语义问题:使用赋值结果作为没有括号的条件 – Stpn

+0

这个警告只是因为编译器确保你'有意识地在if条件中执行赋值('=')(因为您通常需要'=='来进行相等比较)。添加第二组括号(例如:'((self = [self init]))')将会抑制警告,因为这是'='的用法。 –