2011-07-27 13 views
0

私は、サーバーからjson文字列を取得し、それを解析するiPhoneアプリケーションを持っています。それはいくつかのデータを含んでいます。学校の時刻表に関する情報。データはnsdictionaryに格納され、nsmuttablearrayに渡されます。例えばiphone order of json array

正しい方向で私を指摘してください/アレイのさまざまな '根'にどうやってアクセスできるか教えてください。私は、フィールド "Day"を "Monday"としている要素を保存したいと思います(または、私はどのように並べ替え/検索を行うことができますか)。これについての情報(入れ子にされた値へのアクセス方法や変更方法)を見つけようとかなりの時間を費やしていましたが、運がない/。ありがとう..

答えて

1

あなたの最善の策デーで辞書すべてのオブジェクトにアクセスするために=月曜日は、あなたが何をしているかを示すキーパスを持つ述語を使用することになります。

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Day == 'Monday'"]; 
NSArray* mondayCourses = [rows filteredArrayUsingPredicate:predicate]; 

述語を動的にすることもできます。

dayOfTheWeekは、ループ内で現在の曜日を保持してNSStringのかもしれません
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"Day == %@", dayOfTheWeek]; 

など

あなたは配列をソートしたい場合は、ソート記述子を使用して行うことができます。

NSSortDescriptor* idSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"id" 
                    ascending:YES]; 
NSSortDescriptor* levelSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"Level" 
                     ascending:YES]; 
NSArray* sortedMondayRows = [mondayRows sortedArrayUsingDescriptors:[NSArray arrayWithObjects:idSortDescriptor, levelSortDescriptor, nil]]; 
+0

おかげでそれを持っていたら、データを操作する方法を理解しないで結構です。述語に関して、私が価値を渡そうとすると、例えば、 rows = mondayCourses私のプログラムがクラッシュし、コンソールに何もありません。行はnsarray形式ですが、何か考えていますか? –

+0

JSON構造の例を正しく見ていれば、NSDictionaryの "rows"はキー "Array"を持つキーと値のペアを1つだけ保持します。 このように配列を作成すると便利です。 NSArray * courses = [rows objectForKey:@ "Array"]; は次にあなたが、ほぼそのまま私の述語コードを使用することができます(ちょうど変更[行filteredArrayUsingPredicate:述語]; [コースfilteredArrayUsingPredicate:述語]に;) –

+0

おかげで、本当に便利な答え:] –

0

JSONがURL:http://jsonlint.com/で正しいか確認してください。 JSONファイルをパーズする方法をグーグルで読むよりも正しい場合。 JSONファイルの解析に特定のフレームワークを使用していますか?

+0

JSONの構文解析は、私はちょうど私が(私は上記の投稿のアレイ内にあるものを)muttablearrayに返信用 –

0

まず、NSArrayNSDictionaryのAppleのマニュアルを参照してください。この場合、配列(NSArray)にはいくつかのNSDictionariesが含まれているように見えます。

データはnsdictionaryに格納され、nsmuttablearrayに渡されます。

まず、Objective-Cの変数はポインタに過ぎないことに注意してください。あなたはこのような行がある場合:「私は、この変数はNSMutableArrayのを指すように期待」

NSMutableArray *rows; 

をあなただけのそれはかなり同等

id rows; 

、にある、と言っている...そして、あなたは意志実行時に、可変配列に対して宣言された変数に通常の配列を置くこと(または辞書のために宣言された変数に文字列を置くこと)を止めてはいけません。それが動作します!しかし、あなたのプログラムは、変更できない配列や文字列に対する辞書のものに対して変更可能なことをしようとするとクラッシュします。

代わりにIDを、いくつかの利点があり、NSMutableArrayのへのポインタとして、それを宣言:

  • それはあなたがしようとすると、コンパイラが警告を表示することができますメソッド名
  • をオートコンプリートによって、XCodeの助けにあなたをすることができます

    :NSMutableArrayのは、あなたの変数は、この行に、NSMutableArray *rowsとして宣言されている場合でも、だから、

を持っていないメソッドをコールします

...「コース」オブジェクトが変更可能でない場合は、rowsにあるものもそうではありません。 (あなたは、元を保持しているかのように、解放する必要があり)、配列の独自のNSMutableArrayのコピーを取得するには...

rows = [[dict objectForKey:@"courses"] mutableCopy]; 

:代わりに、あなたはこれを行うことができます。


標準のCocoaコードで配列と辞書を探索できます。ここでは「月曜日」のコースのすべてを取得するための一つの方法のようになります。

NSMutableArray *mondayCourses = [NSMutableArray array]; 

for (NSDictionary* course in rows){ 
    if([[course objectForKey:@"Day"] isEqual:@"Monday"]){ 
     [mondayCourses addObject:course]; 
    } 
} 

(警告、私はこのコードを実行していない。)