2

JSON ファイルに必要なデータを取得するのに問題があります。これは、コンソールからの出力の短縮版です。

{
    AUD =     {
        15m = "125.15547";
        24h = "124.74";
        buy = "121.0177";
        last = "125.15547";
        sell = "123.44883";
        symbol = "$";
    };
    BRL =     {
        15m = "120.34";
        24h = "120.34";
        buy = "120.34";
        last = "120.34";
        sell = "120.34";
        symbol = "R$";
    };
    CAD =     {
        15m = "129.08612";
        24h = "131.07";
        buy = "128.66227";
        last = "129.08612";
        sell = "129.08612";
        symbol = "$";
    };
}

組み込みの JSON 解析ライブラリを使用してファイルを解析しようとしています。私の viewDidLoadメソッドのパーサーは次のとおりです。

    _tickerArray = [NSMutableArray array];

    NSURL *tickerDataURL = [NSURL URLWithString:@"https://blockchain.info/ticker"];
    NSData *jsonData = [NSData dataWithContentsOfURL:tickerDataURL];
    NSError *error = nil;
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
    NSLog(@"%@", dataDictionary);
    NSArray *ar = [NSArray arrayWithObject:dataDictionary];
    for (NSString *key in [dataDictionary allKeys]) {
        for (NSDictionary *dict in ar) {
            TickerData *t;
            t.currency = [dict objectForKey:key];
            t.symbol = [dict objectForKey:@"symbol"];
            t.last = [dict objectForKey:@"last"];
            [_tickerArray addObject:t];
        }

    }

AUD or BRL通貨コード ( など) をt.currency、通貨辞書に含まれる他のデータと一緒に保存したいのですが、アプリがクラッシュします。エラーコード:

NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil

どのオブジェクトも追加されないようです_tickerArray

ヘルプ?

編集:他のフィールドに入力する適切なデータで表示するキーを取得します:

 NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
    NSLog(@"%@", dataDictionary);


    for (NSString *key in [dataDictionary allKeys]) {
        NSDictionary *dic=[dataDictionary objectForKey:key];
            TickerData *t=[[TickerData alloc] init];
            t.currency = key;//EDITED
            t.symbol = [dic objectForKey:@"symbol"];
            t.last = [dic objectForKey:@"last"];
            [_tickerArray addObject:t];

    }
4

3 に答える 3

4

tはnilです。割り当て/初期化する必要があります:

TickerData *t = [[TickerData alloc] init];
于 2013-04-04T04:56:45.057 に答える
3
NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];
NSLog(@"%@", dataDictionary);
//NSArray *ar = [NSArray arrayWithObject:dataDictionary];//REMOVED
for (NSString *key in [dataDictionary allKeys]) {
    NSDictionary *dic=[dataDictionary objectForKey:key];//ADDED
    for (NSString *dickey in [dic allKeys]) { //MODIFIED
        NSDictionary *dict=[dic objectForKey:dicKey];//ADDED
        TickerData *t=[[TickerData alloc] init];//ALLOC INIT ?
        t.currency = key;//EDITED
        t.symbol = [dict objectForKey:@"symbol"];
        t.last = [dict objectForKey:@"last"];
        [_tickerArray addObject:t];
    }

}

データには配列、そのすべての辞書が含まれていません。上記のコードを試して、コメントも参照してください..

それがうまくいくことを願っています..

編集:

はい、上記の他の回答で示唆されているように、オブジェクトも初期化しました..

于 2013-04-04T04:56:43.480 に答える
0

それを試してみてください....

NSURL *url = [NSURL URLWithString:@"https://blockchain.info/ticker"];

NSLog(@"API : %@",url);

NSMutableData *jsonData = [NSMutableData dataWithContentsOfURL:url];

NSString *data = [[NSString alloc] initWithBytes: [jsonData mutableBytes] length:[jsonData length] encoding:NSUTF8StringEncoding];

dictionary = [data JSONValue];
NSDictionary *dict = [dictionary objectForKey:@"AUD"];
NSLog(@"%@",dict);
NSString *last = [dict valueForKey:@"last"];
NSLog(@"%@",last);
于 2013-04-04T04:56:26.737 に答える