如何从Objective C中的JSONP中删除回调参数以使其可用?

时间:2013-06-16 01:48:39

标签: ios objective-c json parsing jsonp

我有自己的SBJson库,但我目前只在iOS中使用NSJSONSerialization类。 我打电话给

http://www.google.com/dictionary/json?callback=dict_api.callbacks.id100&q=test&sl=en&tl=en&restrict=pr%2Cde&client=te

并返回带有参数的以下Json文件。

dict_api.callbacks.id100({...},200,null)

据我所知,这是{...}之外的无关紧要的事情,这让我很烦恼。使用Objective C,如何删除所有内容,只剩下{...}?这样我就可以直接进入NSDictionary了。我将数据存储在NSData对象中,如果这很重要的话。我今天刚开始和Json一起工作,所以我非常感谢你的帮助。

NSDictionary *allDataDictionary = [NSJSONSerialization JSONObjectWithData:self.webData options:0 error:nil];

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    [self.webData setLength:0];
    NSLog(@"1");

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    NSLog(@"Failed with error");
    NSLog(@"2");

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [self.webData appendData:data];
    NSLog(@"3");

}

1 个答案:

答案 0 :(得分:2)

这是一个黑客,但你可以这样做(找到第一个'{'和最后'}'):

// Decode the web response data into a string, then:
NSRange begin = [someString rangeOfString:@"{" options:NSLiteralSearch];
NSRange end = [someString rangeOfString:@"}" options:NSBackwardsSearch|NSLiteralSearch];
// Add error checking!
NSString *jsonPart = [someString substringWithRange:NSMakeRange(begin.location, (end.location - begin.location) + 1)];

编辑 - 更好的

JSON可能不是一个对象,所以只需抓住JSONP的parens。

NSRange begin = [responseStringJSONPart rangeOfString:@"(" options:NSLiteralSearch];
NSRange end = [responseStringJSONPart rangeOfString:@")" options:NSBackwardsSearch|NSLiteralSearch];
parseFail = (begin.location == NSNotFound || end.location == NSNotFound || end.location - begin.location < 2);
if (!parseFail)
{
    responseStringJSONPart = [responseStringJSONPart substringWithRange:NSMakeRange(begin.location + 1, (end.location - begin.location) - 1)];
}