[英]JSON parsing returns null to iOS (json string looks correct)
我正在尝试将JSON转换为iOS应用,但始终获取NULL值。
- (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字符串看起来正确:
我的字符串= [{“目标”:{“数量”:“ 100.0”,“ created_at”:“ 2011-08-20T00:55:34Z”,“ id”:1,“名称”:“用户”,“ updated_at “:” 2011-08-20T00:55:34Z“}},{”目标“:{”金额“:” 200.0“,” created_at“:” 2011-08-20T00:56:48Z“,” id“: 2,“名称”:“ User2”,“ updated_at”:“ 2011-08-20T00:56:48Z”}},{“目标”:{“金额”:“ 19999.0”,“ created_at”:“ 2011-08 -20T19:15:10Z“,” id“:3,”名称“:”这是我的目标“,” updated_at“:” 2011-08-20T19:15:10Z“}},{”目标“:{”数量“:” 0.0“,” created_at“:” 2011-08-20T20:46:44Z“,” id“:4,”名称“:”目标“,” updated_at“:” 2011-08-20T20:46: 44Z“}}]
我想念一些基本的东西。
更新 :
这是一行返回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;
}
目标名称和目标金额为空。
这可能不是问题的一部分,但您应该调用[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];
}
密钥更改是第3行中的[dictionary objectForKey:@"goal"]
。
JSON数组由具有单个goal
成员的对象组成,具有initWithDictionary
方法要查找的属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.