4月22日更新:
问题解决了:原来API需要OAUTH才能工作......这解释了为什么它会在浏览器中正确加载(我已经登录)而不是其他应用程序,如JSON验证器或我的自己的应用程序
我正在尝试编写一个类,它将在Lion上的Xcode 4.3.2中获取和解析JSON文件。我只编写了几个星期,很抱歉,如果这是一个有点愚蠢的问题!代码似乎工作正常,除了只显示JSON文件中的前20个条目(应该有200个)。知道为什么会这样吗?
- (void) initJSON
{
NSString *urlstri = [[NSString alloc] initWithFormat:@"http://api.t.sina.com.cn/statuses/followers.json?source=?????&count=200&screen_name=%@", userName];
NSURL *newURL = [[NSURL alloc] initWithString:urlstri];
NSURLRequest *request = [NSURLRequest requestWithURL:newURL];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
[self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:NO];
}
];}
- (void) fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:responseData //1
options:kNilOptions
error:&error];
NSArray* newestFollower = [json objectForKey:@"users"]; //2
fnumber = 0;
mnumber = 0;
int arraySize = [newestFollower count];
NSLog(@"%i",arraySize);
for (i=0; i<arraySize; ++i) {
NSDictionary* userProfile = [newestFollower objectAtIndex: i];
NSString* userGender = [userProfile objectForKey:@"gender"];
//NSLog(@"%@", userGender);
if([userGender isEqualToString:@"m"]){
//NSLog (@"man");
++mnumber;
}
if([userGender isEqualToString:@"f"]){
//NSLog(@"notman");
++fnumber;}
}
mOutput = [NSNumber numberWithInt:(mnumber)];
fObj = [NSString stringWithFormat:@"%i", fnumber];
mObj = [NSString stringWithFormat:@"%i", mnumber];
NSLog (@"Boys:%@", mObj);
NSLog (@"Girls:%@", fObj);
答案 0 :(得分:0)
我不知道这是否可以解决您的问题,但您可以尝试使用NSURLConnection
而非同步NSData
dataWithContentsofURL
方法异步请求数据。
它看起来像这样:
- (void) initJSON
{
NSString *urlstri = [[NSString alloc] initWithFormat:@"http://api.t.sina.com.cn/statuses/followers.json?source=??????&count=200&screen_name=%@", userName];
NSURL *newURL = [[NSURL alloc] initWithString:urlstri];
NSURLRequest *request = [NSURLRequest requestWithURL:newURL];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
[self performSelectorOnMainThread:@selector(fetchedData:) withObject:data waitUntilDone:NO];
}];
}
答案 1 :(得分:0)
编码可能存在问题。一些字符在解析时可能会出现问题(我以前在使用HTMLParser库时遇到过这个问题)。
首先,您可以尝试设置不同的编码器。如果这不起作用,可能会从内容字符串中替换有问题的字符。在过去的项目中,由于HTML解析器的问题我使用了以下内容:
NSString *contents = [[NSString alloc] initWithData:data encoding:NSWindowsCP1252StringEncoding];
// for parsing this weird char has te be removed, else will only parse partially ...
contents = [contents stringByReplacingOccurrencesOfString:@"Ó" withString:@"O"];
data = [contents dataUsingEncoding:NSWindowsCP1252StringEncoding];
可悲的是,我无法找到更清洁的解决方案。
您应该尝试弄清楚您的内容是否有一些无法正确解析的特殊字符,并在解析之前“清理”这些特殊字符中的内容。
P.S。:来自Apple关于JSON序列化程序的文档
数据必须采用JSON规范中列出的5种支持编码之一:UTF-8,UTF-16LE,UTF-16BE,UTF-32LE,UTF-32BE。数据可能有也可能没有BOM。用于解析的最有效编码是UTF-8,因此如果您可以选择对传递给此方法的数据进行编码,请使用UTF-8。