Objective-CでのJSONファイル・データ・オブジェクトの取得方法について

このQ&Aのポイント
  • Objective-CでJSONファイル・データ・オブジェクトを取得する方法について解説します。
  • NSBundleを使用して目的のJSONファイルを取得し、NSURLRequestを使用してJSONオブジェクトを取得します。
  • NSDataを使用してJSONデータを取得し、NSJSONSerializationを使用してNSDictionaryに変換します。
回答を見る
  • ベストアンサー

objective-Cについてご相談があります。

現在objective-cを勉強中なのですが、 jsonについて教えて頂きたい事があります。 jsonのファイル・データ・オブジェクトそれぞれを 取得する必要があると習ったのですが、それらの違いが 今ひとつ分かりません。 下記のような記述なのですが、それぞれの違いをどなたか ご教示頂けないでしょうか。 // 対象Jsonファイル取得 NSBundle *bnd = [NSBundle mainBundle]; NSString *ptn = [bnd pathForResource:@"Test01" ofType:@"json"]; NSURL *url = [NSURL fileURLWithPath:ptn]; // Jsonオブジェクトの取得 NSURLRequest *req =[NSURLRequest requestWithURL:url]; NSData *dat = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:nil]; // Jsonデータの取得 NSDictionary *dick01 = (NSDictionary *) [NSJSONSerialization JSONObjectWithData:dat options:NSJSONReadingMutableContainers error:nil]; 以上、何卒宜しくお願い致します。

noname#213637
noname#213637

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.2

人間が(人間の脳が)ある事象を理解するとはどういうことか、考えたことがありますか?いい機会ですから、考えてみましょう。 対象の事象に関する、説明、解説、定義などを読み、理解することが、その事象に対する理解になる。それもひとつのありかたでしょうが、理解のプロセスはそれだけではなく、人間の理解のしかたは、そうではないプロセスのほうが圧倒的に多いのが事実です。 質問:犬と猫の違いはなにか? ワンとなけば犬で、ニャーとなけば猫。そういう両方の定義で区別することができますが、人間は鳴き声を聞かなくても、犬と猫を区別することができます。百科事典で調べてみても、定義が犬と猫で大きく異なるものにはなっていないでしょう。四つ足で歩き、全身が毛で覆われ、口元にひげが生えていて、主に肉食である。ほとんど共通した特徴だらけです。しかし、多くの人間はひとめで犬と猫を見分けることができる。それどころか、チワワを見ても、セントバーナードを見ても、犬と認識する。さらに、マンガの中に出てくる犬も、ぬいぐるみの犬も、犬と認識する。人間の認識(理解)する能力は、ひじょうに複雑で高等であることがわかると思います。 赤ん坊が言葉を覚えるプロセスも、考えてみてください。かれら赤ん坊は、認定を受けた教師がついて、洗練された教科書と、入念に検討されたカリキュラムによって、勉強をしたうえで、言葉を覚えたのでしょうか?そうではない。だれが教えたわけでもなく、自然に言葉を覚え、しゃべれるようになります。 以上、ふたつの事例を出しましたが、共通していえることは、経験の量が理解の深さに比例するという点です。犬や猫をたくさん自分の目で見ることによって、犬を犬と、猫を猫と認識することができます。赤ん坊は、両親が言葉を交わすところを見聞きしたり、テレビから聞こえる言葉を耳にすることで、言葉を覚えていきます。 ことほどさように、数をこなせば理解できること、数をこなさなければ理解に達しないことが、たくさんあることがわかると思います。そして、そういうプロセスで理解する能力が、人間にあること。その能力はあなたにもあることを信じることが大切だと思います。 さて、ようやくですが出発点に立ちましょう。 「データ」も「オブジェクト」もそうとうに抽象度の高い語句なので、説明や定義を読んでも、すぐに理解できるものではありません。プログラミングについて勉強し、自身でプログラムをする経験を積むことによって、はじめて理解できるものと、とらえておいたほうがいいでしょう。ただし「ファイル」は、コンピュータに触れ、操作している段階で、理解できることばです。 あなたが提示したサンプルプログラムに出てくるコメント行は、ちょっと適切とはいえないでしょうね。適切でないので、「Jsonファイルてなに?」、「Jsonオブジェクトてなに?」、「Jsonデータの取得てなに?」となるんだろうと思います。私なりにコメントするとしたら…… // 読み込みたいJSONファイルのURLを取得 // JSONファイルをネットワーク経由で読み込んで、ソースをNSDataインスタンスに格納 // JSONソースを、アクセス可能な形に整形して、NSDictionaryインスタンスに格納 (ま、「ソース」でも「データ」でもいいんですけど)

noname#213637
質問者

お礼

ご回答ありがとうございます。 私は長い道のりの上にいるのですね・・・ 頑張って勉強していきます。ありがとうございました。

その他の回答 (1)

回答No.1

Jsonファイルの中にJsonオブジェクトが入っています。 Jsonオブジェクトの中にJsonデータが入っています。 だから、Jsonデータを取得するにはJsonファイルから 順番に取得していく必要があります。

noname#213637
質問者

お礼

ご回答ありがとうございます。 度々の質問ですみませんが、ファイルの中にはオブジェクト以外に何かあるのでしょうか。 また、オブジェクトの中身はデータ以外に何があるのでしょうか?

関連するQ&A

  • xcodeの音を鳴らすのを遅らせる方法

    xcodeで音を鳴らしたいんですけど、 ボタンを押して数秒したら音が鳴るようにしたいんですけどどうしたらいいでしょうか? ループさせるので音源の最初を空白にするわけにはいきません。 あとAVAudioPlayerを使ったやり方だと助かります。 NSString *bgmPath = [[NSBundle mainBundle] pathForResource:@"music"ofType:@"mp3"]; NSURL *bgmUrl = [NSURL fileURLWithPath:bgmPath]; sound = [[AVAudioPlayer alloc] initWithContentsOfURL:bgmUrl error:nil]; [sound setNumberOfLoops:0]; //ここに指定した時間遅らせるというのを入れたい// [sound play]; どうかよろしくお願いします。

  • Objecive-C

    NSDictionary *row1 = [[NSDictionary alloc]initWithObjectsAndKeys:            @"MacBook",@"Name",@"White",@"Color",nil]; NSDictionary *row2 = [[NSDictionary alloc]initWithObjectsAndKeys:        @"MacPro",@"Name",@"Silver",@"Color",nil]; NSArray *array● = [[NSArray alloc]initWithObjects:row1,row2,nil]; これをplistを使って実現させようと思ったのですが、 NSString *path =[[NSBundle mainBundle]pathForResource:@"Celldata" ofType:@"plist"]; NSArray *array○ = [[NSArray alloc]initWithContentsOfFile:path]; *array●と*array○は同様の配列で実現可能ですか? plistに問題があるのでしょうか?。 plistは、下記です。 key Type Value Root Dictionary row1 Dictionary ( 2 items) Name String MacBooc Color String White

  • Objective-C

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Dat"ofType:@"plist"]; NSMutableDictionary *dic = [[NSMutableDictionary alloc]initWithContentsOfFile:path]; NSArray *array = [[NSArray alloc]init]; for (id keys in dic) { array = [dic objectForKey:keys]; } *dicには、下記のキー、値が入ってます。(NSLOGで確認しました。) D = ( DAT,DIOP,DSE );... N = ( NET,NW );... Y = (YEA,YAC ); 上記のコードだと、値が全てarrayに格納されませんでした。 なぜか、キーがNの値だけが格納されてしまいます。 全てのキーの値を格納するには、どうしたらよいのでしょうか? よろしくお願いします。

  • cocoa resources内のファイルを取得

    教えて頂けますか? アプリケーション.app/Contents/Resources/内にあるファイルの取得に、 object = [[NSDictionary dictionaryWithContentsOfFile:[[[NSBundle mainBundle]bundlePath]stringByAppendingPathComponent:@"Contents/Resources/hoge.plist"]]retain]; の様にしています。 もっとスマート?カンタンに取得できる方法がありますか? よろしくおねがいします。

    • ベストアンサー
    • Mac
  • iPhone開発について

    初歩的な質問ですが、お願い致します。 ボタンをタップで音が鳴り、再びタップで音を止めるという動きを AVAudioPlayerを利用し実装したいと考えておりますがストップが思い通りに動きません。 プレイは正常に動作しております。 xCode4 で xib を利用しております。 該当部分だけコードを以下に抜粋させていただきます。 hogeController.m - (IBAction)btn{ NSString *path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *oto = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; if (hogeFlg == NO){ hogeFlg = YES; [oto play]; }else{ hogeFlg = NO; [oto stop]; } } デバッグでは、2回目のタップで、[oto stop];は通過しております。 基本的なところが理解できていないためということはわかっているのですが、解決策がわかりません。 また、xib を利用しておりますので、起動時に、- (void)viewDidload を読み込むのかな? と思い、入れてみたのですが通っておりません。 本当は、ここでセットして、ボタンタップじでは、再生と停止の処理だけを入れたいのですが、そういうことは可能なのでしょうか。 どうぞ、よろしくお願い致します。

  • NSTimerカウントダウンで音楽を停止するには?

    Xcodeで iPhoneアプリ作りに奮闘している初心者です。 NSTimerでカウントダウンタイマーを設定しましたが、タイマー終了とともに BGM音楽を停止したいのですが、.p ファイルに #import <AVFoundation/AVFoundation.h> と追加して、.m ファイルに タイマー終了時にイベントとして、 if (RestTime == 0) { timeflag = false; NSString *bgmPath = [[NSBundle mainBundle] pathForResource:@"xxxx"ofType:@"mp3" ]; NSURL *bgmUrl = [NSURL fileURLWithPath:bgmPath]; sound = [[AVAudioPlayer alloc] initWithContentsOfURL:bgmUrl error:nil]; [sound setNumberOfLoops:-1]; [sound stop]; とコードをいれてみましたが、タイマーは終了しても音楽は止まらず鳴りっぱなしです。 NSTimer周辺に詳しい方で、カウントダウンタイマー終了と同時に他の作動をとめる設定(プログラムコード)をお知りのかたお助けねがいます。 また、すでに鳴っている(他のページ又は同じページ,controller内の)音楽をタイマーに合わせて止めることが不可能なら、タイマースタートボタンを押すと同時に音楽をスタートし、タイマー終了とともに音楽を停止するプログラムコードを教えていただけたら助かります。 よろしくお願いします。

  • AVAudioPlayer インスタン

    iPhone の自作アプリで音声に関する場所を作成しているのですが AVAudioPlayerのインスタン作成場所について知りたいことがあります touchesMoved内 もしくは別クラスで音声を再生させる際 [ABC play];の上にコードを書き込み NSString *_ABC = [[NSBundle mainBundle] pathForResource:@"ABC" ofType:@"caf"]; ABC = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:_ABC] error:NULL]; [ABC play]; このようなコードになりました ここで思ったのですが 処理を実行する際、playだけを行ってくれればいいのに 上記コードだと2回目3回目の処理で毎回cafファイルを読み込みインスタンを生成する といった処理内容になってしまうのでしょうか? ツールを使用しメモリ使用率を確認したところAVAudioPlayerで メモリリークしているみたいです ログにはerror = 24 (Too many open files)と表示されます releaseもしていないのでそれも原因と考えられますが複数の音声を同時 もしくはバラバラ、もしくは同じ音声を連続で再生することもあるので releaseをどこに入れたらうまくいくのか理解できていません コードを書き込む位置も含めて簡潔でいいのでアドバイスをいただけるとありがたいです

  • LinearPCMをwavで保存する方法

    ios(objective-c)で録音機能を作っているのですが、下記の様な宣言で行った場合 LinearPCMで保存することができると思います。 これをwavフォーマット保存するにはどの様に(変換?)すれば良いのでしょうか? よろしくお願いいたします。 NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithUnsignedInt:kAudioFormatLinearPCM], AVFormatIDKey, [NSNumber numberWithFloat:44100.0], AVSampleRateKey, [NSNumber numberWithUnsignedInt:1], AVNumberOfChannelsKey, [NSNumber numberWithUnsignedInt:16], AVLinearPCMBitDepthKey,nil]; AVAudioRecorder *recorder = [[AVAudioRecorder alloc] initWithURL:[NSURL fileURLWithPath:filePath] settings:settings error:&error];

  • iphoneアプリの開発

    電卓アプリを作っています。 今困っているのは 1.割り算で小数点以下の計算ができない。 2.3つ以上の計算が(2×3×4のような)足し算しかできない。 3.間違えて数値を入力した場合に使うバックスペース的なボタンの作り方。 です。 どれか一つでもいいのでアドバイスいただけたらありがたいです。 #import "myViewController.h" @implementation myViewController // The designated initializer. Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad. /* - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization. } return self; } */ // Implement viewDidLoad to do additional setup after loading the view, typically from a nib. - (void)viewDidLoad { [super viewDidLoad]; startInput = YES; currentValue = 0; } -(IBAction)numberButtonPressed:(id)sender { UIButton *b = (UIButton *)sender; if( startInput ){ // 最初の1桁目が0なら表示しない if( b.tag == 0 ) return; // 新しく表示する文字列を作成 label.text = [NSString stringWithFormat:@"%d", b.tag]; startInput = NO; } else { // すでに表示されている文字列に連結 label.text = [NSString stringWithFormat:@"%@%d", label.text, b.tag]; } NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audio play]; } -(IBAction)equalButtonPressed:(id)sender { currentValue = sum; sum = sum-sum; // 直前に押された演算子で場合分け if( operation == 0 ){ currentValue += [label.text intValue]; } else if( operation == 1 ){ currentValue -= [label.text intValue]; } else if( operation ==2){ currentValue *= [label.text intValue]; } else if (operation ==3){ currentValue /= [label.text intValue]; } // 表示の更新 label.text = [NSString stringWithFormat:@"%d", currentValue]; startInput = YES; label2.text =@"="; NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audio play]; } -(IBAction)opButtonPressed:(id)sender { UIButton *b = (UIButton *)sender; // 現在値の保存 if( operation == 0 ){ currentValue= [label.text intValue]; sum +=currentValue; label.text =[NSString stringWithFormat:@"%d", sum]; } // 演算の保存 operation = b.tag; startInput = YES; if( operation == 0 ){ label2.text =@"+"; } if( operation == 1 ){ label2.text =@"-"; } if( operation == 2 ){ label2.text =@"×"; } if( operation == 3 ){ label2.text =@"÷"; } NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audio play]; } -(IBAction)clearButtonPressed:(id)sender { label.text = @"0"; startInput = YES; label2.text =@""; NSString *path = [[NSBundle mainBundle] pathForResource:@"button5" ofType:@"wav"]; NSURL *url = [NSURL fileURLWithPath:path]; AVAudioPlayer *audio = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil]; [audio play]; } /* // Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { // Return YES for supported orientations. return (interfaceOrientation == UIInterfaceOrientationPortrait); } */ - (void)didReceiveMemoryWarning { // Releases the view if it doesn't have a superview. [super didReceiveMemoryWarning]; // Release any cached data, images, etc. that aren't in use. } - (void)viewDidUnload { [super viewDidUnload]; // Release any retained subviews of the main view. // e.g. self.myOutlet = nil; } - (void)dealloc { [super dealloc]; } @end

  • objectiv-cで困っています。教えてください

    objectiv-cの勉強を始めたばかりです。ネットで調べながら進めているのですが、プロジェクト内のテキストファイルではなく、サーバにあるテキストファイルの内容を読み込み、NSLogに出力しようとしているのですが、うまくいきません。xxxxxxxxxxxの部分にテキストファイルのあるURLを入れています。 -----------------textloadViewController.h------------------------------ #import <UIKit/UIKit.h> @interface textloadViewController : UIViewController @end -----------------textloadViewController.m------------------------------ #import "textloadViewController.h" @interface textloadViewController () @end @implementation textloadViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. NSError *error = nil; NSString *filePath = [[NSBundle mainBundle] pathForResource:@"xxxxxxxxxxx" ofType:@"txt"]; NSString *string = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:&error]; NSLog(@"%@", string); } @end 外部のテキストファイルを読み込む方法を教えてください。よろしくお願いします。

専門家に質問してみよう