【问题标题】:Array returned from SBJSON parser is invalid (iOS)从 SBJSON 解析器返回的数组无效 (iOS)
【发布时间】:2014-03-25 16:18:37
【问题描述】:

我在从 PHP 网络服务返回的响应字符串上使用 SBJSON 解析器时遇到错误:

NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

NSError *error;
SBJSON *json = [SBJSON new];
NSArray *returnedFromWeb = [json objectWithString:responseString error:&error];

[articles_parsed removeAllObjects];

for (int i = 0; i < [returnedFromWeb count]; i++) 
{
    NSDictionary *dictColumns = [returnedFromWeb objectAtIndex:i];
    [self parseArticlesObject:dictColumns];
    dictColumns = nil;
}

我在上面的 objectAtIndex 调用中收到 unrecognized selector sent to instance 错误。当我检查我的数组 (returnedFromWeb) 中包含的值时,它显示有 17 个对象。但是,检查每个对象都会显示以下错误:

(<invalid>) [0] = <error: expected ']' error: 1 errors parsing expression >

我已经在下面的索引 [0] 处发布了从 SBJSON 解析器返回的数据:

{
    0 =     {
        author = "CCJ Staff";
        category1 = Products;
        excerpt = "Toyo";
        modified = "2014-03-25 08:33:57";
        "short_link" = "http://www.example.com/?p=95326";
        thumbnail = "http://www.example.com/files/2014/03/ Tire.jpg";
        "thumbnail_243x243" =     "http://www.example.com/ihz.php?src=/blogs.dir/10/files/2014/03/ Tire.jpg&amp;w=243&amp;h=243&amp;q=100&amp;zc=1";
        title = "medium-duty";
    };

这是 SBJSON 正在解析的字符串(缩短为仅包含第一个对象,末尾的逗号是下一个对象开始的位置):

{"numberposts":240,"tax_query":[{"taxonomy":"topic","terms":[75,43550,14394,16564,1795,43,22,12950],"field": "term_id","orderby":"date","order":"DESC"}],"0":{"title":"medium-duty","category1":"Products", 摘录":"东洋","修改":"2014-03-25 08:33:57","作者":"员工","缩略图":"http://www.ccjdigital.com/files/2014/03/Tire.jpg","short_link":"http:// www.ccjdigital.com/?p=95326"},

任何帮助表示赞赏!我对 iOS 和 SBJSON 还很陌生,无法弄清楚为什么我的数组无效。

【问题讨论】:

  • 您是否验证了从 Web 服务器接收到的 json 以确保其格式正确?
  • 你的 returnedFromWeb 可能不是一个 NSArray 而是一个 NSDictionary。
  • 另外,objectWithString 消息会告诉你……一个对象,而不是一个数组。
  • 请升级您的 SBJson 版本。 “SBJSON”类在 2 个主要版本中不存在……在最近的版本中早已不复存在。

标签: ios objective-c sbjson


【解决方案1】:

我的第一个想法是你得到的是一个 NSDictionary 而不是一个 NSArray。要找出在返回的项目上调用 objectAtIndex 之前添加断点,并在屏幕底部的调试器中键入:po [returnedFromWeb class]

这将告诉您返回对象的实际类。 我说它可能是字典,因为您粘贴的 JSON 以 {(大括号)开头,其中数组以 [

由于您不能始终保证 JSOn 将被格式化为数组或字典,因此您可以进行一些测试以查看它是否响应 objectAtIndex: 方法,例如,这表明它是一个 NSArray。

id *returnedFromWeb = [json objectWithString:responseString error:&error];
if ([returnedFromWeb respondsToSelector:@selector(objectAtIndex:)]) {
  //it's an array do array things.
} else {
  //it's a dictionary do dictionary things.
}

希望有帮助!

【讨论】:

  • 我会将respondsToSelector:@selector(objectAtIndex:)] 切换为isKindOfClass:[NSArray class]。更干净更清晰...(:
  • 我完全同意,但有人对我说,没有说明原因,使用 isKindOfClass 是不好的做法。否则完全可以。
  • @Cocoadelica 将您的答案标记为已接受。这就是问题所在。查询和返回数据的 web 服务最近被另一位开发人员修改,返回类型现在是 NSDictionary 而不是我期望的 NSArray。我没有意识到两者都可以退货。感谢您的帮助!
猜你喜欢
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多