0

JSON を使用して yahoo ファイナンスのデータを解析しようとしています。何らかの理由でアプリがクラッシュし続けます。コードの最後の行がクラッシュを引き起こしているようです。その行をコメントアウトすると、クラッシュは発生しません。これが私がこれまでに持っているものです....何かアイデアはありますか?

#define kBgQueue dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
#define kLatestKivaLoansURL [NSURL URLWithString:     @"http://query.yahooapis.com/v1/public/yql?    q=select%20*%20from%20yahoo.finance.quotes%20where%20symbol%20in%20(%22AAPL%22)%0A%09%09&env    =http%3A%2F%2Fdatatables.org%2Falltables.env&format=json"] //2

#import "JsonViewController.h"

@implementation JsonViewController

- (void)viewDidLoad
{
[super viewDidLoad];

dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: 
                    kLatestKivaLoansURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) 
                           withObject:data waitUntilDone:YES];
});
}

- (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization 
                      JSONObjectWithData:responseData //1

                      options:kNilOptions 
                      error:&error];

NSArray* latestLoans = [json objectForKey:@"query"]; //2

NSLog(@"query: %@", latestLoans); //3

NSDictionary* loan = [latestLoans objectAtIndex:0]; /////// Where crash happens //////
}
@end

これはコンソールのエラーメッセージです

[__NSCFDictionary objectAtIndex:]: 認識されないセレクターがインスタンス 0x6a65420 2012-07-15 01:18:29.492 Json[1730:f803]送信されましたインスタンス 0x6a65420 に送信されたセレクター

4

2 に答える 2

2

objectAtIndex:NSDictionaryに送信しようとしています。しているとき

NSArray* latestLoans = [json objectForKey:@"query"]; //2

では[json objectForKey:@"query"]なく「NSDictionary」を返しますNSArray。あなたはこれを見ることができます

NSLOG(@"CLASS is %@ ",[latestLoans Class]);

after "NSArray* latestLoans = [json objectForKey:@"query"];" 声明。解析する前に、JSON 文字列を注意深く調べてください。jsonを解析するようにすると、より詳細な回答が得られます。

于 2012-07-15T05:51:35.733 に答える
2

これは、JSON が NSArray ではなく NSDictionary にデコードされているためです。yahoo の応答が適切に表示されている場合は、おそらく取得objectForKey:@"results"してから、次のようobjectForKey:@"quote"にします。

NSDictionary *resultQuery = [json objectForKey:@"query"];
NSDictionary *results = [resultQuery objectForKey:@"results"];
NSDictionary *quote = [resultQuery objectForkey@"quote"];

これは、投稿した URL の JSON がどのように構造化されているかです。

{"query": {
     "count":1,
     "created":"2012-07-15T05:48:29Z",
     "lang":"en-US",
     "results":{
         "quote":{
               "symbol":"AAPL","Ask":"605.00"
                 }
               }
           }
}

もちろん、それを適切な検証手順に拡張する必要がありますが、重要なのは、返された JSON の実際の内容を知ることです (URI を調べたところ、配列はどこにもありませんでした)。

于 2012-07-15T05:54:36.223 に答える