0

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);
4

2 に答える 2

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];

残念ながら、よりクリーンなソリューションを見つけることができませんでした。

正しく解析できない特殊文字がコンテンツに含まれているかどうかを確認し、解析する前にこれらの特殊文字からコンテンツを「消去」する必要があります。

PS:JSONシリアライザーに関するAppleのドキュメントから

データは、JSON 仕様にリストされているサポートされている 5 つのエンコーディング (UTF-8、UTF-16LE、UTF-16BE、UTF-32LE、UTF-32BE) のいずれかである必要があります。データには BOM がある場合とない場合があります。解析に使用する最も効率的なエンコーディングは UTF-8 であるため、このメソッドに渡されるデータのエンコーディングを選択できる場合は、UTF-8 を使用してください。

于 2012-04-19T18:00:13.300 に答える
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];
    }];
}
于 2012-04-19T17:06:49.800 に答える