iOS:NSArray的JSON字符串无法按预期工作

时间:2011-10-21 00:16:19

标签: ios json

如何解析iOS应用中的JSON字符串?使用SBJSON。运行下面的代码。获取数据是成功的,但即使JSON字符串包含条目,数组中条目数的计数也为零。我的问题是如何在循环中查询JSON字符串?

谢谢!

// Create new SBJSON parser object
SBJsonParser *parser = [[SBJsonParser alloc] init];

// Prepare URL request to download statuses from Twitter
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://safe2pee.org/api/proxlist.php?location=37.7626214,-122.4351661&distance=1"]];

// 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];

NSLog(@"string equal = %@", json_string);

// parse the JSON response into an object
// Here we're using NSArray since we're parsing an array of JSON b objects
NSArray *bathrooms = [parser objectWithString:json_string error:nil];

NSLog(@"count = %d", [bathrooms count]);

// Each element in bathrooms is a single bathroom
// represented as a NSDictionary
for (NSDictionary *bathroom in bathrooms)
{
    // You can retrieve individual values using objectForKey on the bathroom NSDictionary
    // This will print the tweet and username to the console
    NSLog(@"%@ - %@", [bathroom objectForKey:@"name"], [[bathroom objectForKey:@"lat"] objectForKey:@"long"]);
}

2 个答案:

答案 0 :(得分:2)

这是因为它不起作用。那不是有效的JSON字符串。这是两个JSON词典,背靠背,两者之间有一个逗号。它缺少包裹[]。如果您实际测试-objectWithString:error:的结果值,则会看到它为零,如果您将NSError**传递给error参数,则会收到错误消息告诉你它是无效的JSON。

答案 1 :(得分:0)

我查看了在帖子中请求URL时返回的JSON字符串,看起来它被服务器不正确地截断了。返回的JSON字符串包含一个字典结构,其中包含一个名为“bathroom”的键,其值为字典结构数组。每个浴室字典结构都包含几个字段,包括“bid”,“name”,“lat”,...,“directions”和“comment”。

当我滚动到我收到的JSON的末尾时,我在“浴室”数组下看到一个完整的字典结构(“bid”是“MTIyIFMyUA ==”,“name”是“Momi Tobi's”。那个字典结构包含它的右括号但数组的结束“]”缺失,顶级字典结构的结束“}”丢失。

您应该查看该服务以了解它返回无效JSON字符串的原因。一旦你有了一个有效的字符串,看起来你应该从NSDictionary开始并解析它是这样的:

NSDictionary *result = [parser objectWithString:json_string error:nil];
NSArray *bathrooms = [result objectForKey:@"bathrooms"];