-1

iOS 用の Facebook フィード アプリを作成しようとしていますが、JSON フレームワークを使用しようとしていますが、ほとんど効果がありません。コードを実行するたびに、「*キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'データ パラメータが nil' です」というエラーが表示されます。Flickr からのフィードをテスト/デモンストレーション URL として使用しています。これは、Facebook URL がアクセス トークン リクエストと appendToString: を使用してプログラムで作成されているためです。

    NSURL *url2 = [NSURL URLWithString:@"www.flickr.com/services/feeds
                     /photos_public.gne?tags=punctuation&someKey=atsign&format=json"];
    NSError *error = nil;
    NSData *data = [NSData dataWithContentsOfURL:url2];
    if (data == nil){
        NSLog(@"data is nil");
    }
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data 
                                                         options:NSJSONReadingMutableContainers
                                                          error:nil];
    NSLog(@"json: %@\n\n Or Error: %@", json, [error localizedDescription]);

編集: エラーと NSlog を含めるようにコードを変更し、URL を変更し (投稿者 ilis のアドバイスに従って)、データが nil かどうかをテストする if ステートメントを追加しました (アイデアについて投稿者のダスティンに感謝します)。 )。これで、「json: (null) Or Error: The operation could not be completed. (Cocoa error 3840.)」という NSLog からの出力が得られ、if ステートメントからの応答はありません。したがって、NSDictionary json の作成時に問題が発生していると思います。

4

3 に答える 3

1

URL が正しく作成されていません。dataWithContentsOfURL無効な URL で呼び出すと、 nil NSData. NSDataJSON シリアライゼーション メソッドは、オブジェクトを予期しますが、取得nilするため、スローしNSInvalidArgumentExceptionます。

URL が有効であることを確認する必要があるだけです。JSON シリアル化を実行する前に、それdataが非であることを確認することをお勧めします。nil

データがゼロかどうかを確認する方法

if (data == nil)
{
     //handle the problem
}
else
{
     //You have valid content, do something with it
}
于 2012-07-31T14:08:35.560 に答える
1

Flickr は、パーサーが処理できない JSON でいくつかの悪いことを行います。

  • それらは「jsonFlickrFeed(」で始まり、「)」で終わります
    • これは、ルート オブジェクトが無効であることを意味します。
  • それらは一重引用符を誤ってエスケープします.. \'
    • これは無効な JSON であり、パーサーを悲しませます!

Flick JSON フィードの処理を検討している場合

//get the feed
NSURL *flickrFeedURL = [NSURL URLWithString:@"http://api.flickr.com/services/feeds/photos_public.gne?format=json&tags=data"];
NSData *badJSON = [NSData dataWithContentsOfURL:flickrFeedURL];
//convert to UTF8 encoded string so that we can manipulate the 'badness' out of Flickr's feed
NSString *dataAsString = [NSString stringWithUTF8String:[badJSON bytes]];
//remove the leading 'jsonFlickrFeed(' and trailing ')' from the response data so we are left with a dictionary root object
NSString *correctedJSONString = [NSString stringWithString:[dataAsString substringWithRange:NSMakeRange (15, dataAsString.length-15-1)]];
//Flickr incorrectly tries to escape single quotes - this is invalid JSON (see http://stackoverflow.com/a/2275428/423565)
//correct by removing escape slash (note NSString also uses \ as escape character - thus we need to use \\)
correctedJSONString = [correctedJSONString stringByReplacingOccurrencesOfString:@"\\'" withString:@"'"];
//re-encode the now correct string representation of JSON back to a NSData object which can be parsed by NSJSONSerialization
NSData *correctedData = [correctedJSONString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:correctedData options:NSJSONReadingAllowFragments error:&error];
if (error) {
    NSLog(@"this still sucks - and we failed");
} else {
    NSLog(@"we successfully parsed the flickr 'JSON' feed: %@", json);
}
于 2013-04-24T08:44:16.850 に答える
0

StackOverflow: NSJSONSerializationで答えを発見しました。

Flickr の JSON フィードが適切にフォーマットされていないことが判明したため、データには で処理できない接頭辞を持つ情報が取り込まれていましたNSJSONSerialization

于 2012-08-01T13:47:01.590 に答える