2014-03-25 34 views
0

我遇到一个错误使用SBJSON解析器对一个响应字符串从PHP web服务返回:阵列从SBJSON解析器返回无效(IOS)

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。当我检查数组中包含的值(returnedFromWeb)时,它显示有17个对象。然而,检查每个对象是否显示以下错误:

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

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

{ 
    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", excerpt":"Toyo","modified":"2014-03-25 08:33:57","author":"Staff","thumbnail":"http://www.ccjdigital.com/files/2014/03/Tire.jpg","short_link":"http://www.ccjdigital.com/?p=95326"},

任何帮助表示赞赏!我对iOS和SBJSON相当陌生,并且一直无法弄清楚为什么我的数组无效。

+0

您是否验证过您从Web服务器接收的json以确保其格式正确? –

+0

您的returnedFromWeb可能不是NSArray,而是NSDictionary。 – streem

+0

另外,'objectWithString'消息会给你一个...一个对象,而不是一个数组。 –

回答

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. 
} 

希望帮助!

+1

我会用'isKindOfClass:[NSArray class]'切换'respondsToSelector:@selector(objectAtIndex :)]'。清洁和更清晰...(: –

+0

我会完全同意,但有人对我说,没有为什么,因为它是不好的做法,使用isKindOfClass是不好的做法。否则是完全。 – Cocoadelica

+0

@Cocoadelica标记你的答案被接受。这就是问题所在。查询和返回数据的webservice最近被另一个开发者修改了,返回类型现在是一个NSDictionary,而不是我期待的NSArray。我没有意识到两者都可以返回,谢谢你的帮助 – tbmills1