iOS:到 NSArray 的 JSON 字符串未按预期工作

Posted

技术标签:

【中文标题】iOS:到 NSArray 的 JSON 字符串未按预期工作【英文标题】:iOS : JSON String to NSArray not working as expected 【发布时间】:2011-10-21 00:16:19 【问题描述】:

如何在 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"]);

【问题讨论】:

试试[json_string JSONValue] 【参考方案1】:

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

【讨论】:

对不起,我应该澄清一下我没有发布整个 json 字符串。我要编辑它。整个字符串相当大。 我的观点仍然存在;您很可能会收到nil 的回复。需要传入一个错误变量,测试-objectWithString:error:的结果,如果是nil则打印出错误。 这是返回的错误....2011-10-20 17:35:22.868 JSOHHelp[8887:f803] 错误是 Error Domain=org.brautaset.SBJsonParser.ErrorDomain Code= 0 "输入意外结束" UserInfo=0x68831d0 NSLocalizedDescription=输入意外结束 这是第一个条目... "status":"success", "message":"bathrooms found", "location":"37.762621,-122.435166", "radius": "1", "tally":"43", "bathrooms": [它有一个括号,但最后一个条目没有。 听起来字符串没有正确平衡就终止了,例如它缺少结束 ] 或 或其他内容。【参考方案2】:

我查看了当我在您的帖子中请求 URL 时返回的 JSON 字符串,看起来它被服务器不正确地截断了。返回的 JSON 字符串包含一个字典结构,其中包含一个名为“浴室”的键,其值是一个字典结构数组。这些浴室字典结构中的每一个都包含多个字段,包括“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"];

【讨论】:

以上是关于iOS:到 NSArray 的 JSON 字符串未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

如何将带有对象数组的 json 字符串转换为带有 nsdictionaries 的 nsarray - IOS

Json 到 iOS 编码错误

JSON 解析:NSArray POST

iOS:JSON 解析为 NSArray?

如何将 NSArray 或 NSDitory 从 iOS 发送到 PHP webservice

变量未正确保存