1

我可以使用 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");

}
4

1 回答 1

2

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

// 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 的括号即可。

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)];
}
于 2013-06-16T06:32:25.250 回答