2011-10-28 11 views
0

SBJsonParserを使用しているときにJSONを解析する際に、私は現在奇妙な問題が発生しています。JSONの解析 - SBJsonParserの問題

私が解析しているJSONは次のとおりです。

[ 
    { 
     "Company":{ 
     "id":"1", 
     "company_name":null 
     }, 
     "relations":{ 
     "store":[ 
      { 
       "id":"1", 
       "restaurant_name":"Dubai", 
       "brief_description":null 
      }, 
      { 
       "id":"2", 
       "restaurant_name":"Test2", 
       "brief_description":null 
      } 
     ] 
     } 
    } 
] 

私は簡単にNSDictionaryのを作成し、会社ノード(?)のための正しい情報とそれを埋めることができます。

しかし、関係のノードになると、私の問題が発生します。

NSDictionary *relations = [object valueForKey:@"relations"]; 
NSArray *multipleStores = [relations valueForKey:@"store"]; 
NSLog(@"relations: %@", relations); 

for (NSDictionary *singleStore in multipleStores){ 

     NSLog(@"Single Store: %@", singleStore); 

     [company grabStoreInformation:singleStore]; 

} 

上記のNSLogが返されたのは以下のとおりです。

relations: (
    { 
    store =   (
        { 
      "brief_description" = "<null>"; 
      id = 1; 
      "restaurant_name" = Dubai; 
     }, 
        { 
      "brief_description" = "<null>"; 
      id = 2; 
      "restaurant_name" = Test2; 
     } 
    ); 
} 
) 

NSLogで何が起きていないのであれば、これで問題ありません。 singleStoreは実際に個々のストアノードを取得するのではなく、両方のストアノードを一緒に追加しているようです。

Single Store: (
    { 
    "brief_description" = "<null>"; 
    id = 1; 
    "restaurant_name" = Dubai; 
    }, 
    { 
    "brief_description" = "<null>"; 
    id = 2; 
    "restaurant_name" = Test2; 
    } 
) 

問題は、各ストアノードをNSMutableArrayに追加する必要があることです。したがって、NSDictionaryはNSMutableArrayに追加され、他の場所(UITableViewデータソース用)からアクセス可能になります。

店舗ノードを別々にするとどんな助けになるか大いに感謝します。解析のために全体のコード、を求めたよう

EDIT

 SBJsonParser *parser = [[SBJsonParser alloc] init]; 

     // parse the JSON string into an object - assuming [response asString] is a NSString of JSON data 
     NSDictionary *object = [parser objectWithString:[response asString] error:nil]; 

     [parser release]; 

     NSDictionary *companyDetails = [object valueForKey:@"Company"]; 

     MACompany *company = [MACompany sharedMACompany]; 
     [company initWithDetails:companyDetails]; 

     NSDictionary *relations = [object valueForKey:@"relations"]; 
     NSArray *multipleStores = [relations valueForKey:@"store"]; 

     NSLog(@"relations: %@", relations); 

     for (NSDictionary *singleStore in multipleStores){ 

      NSLog(@"Single Store: %@", singleStore); 

      [company grabStoreInformation:singleStore]; 

     } 

あなたは、私はJSONの要素をコピーするシングルトンクラスに依存している見ることができるように。これは、単なる店舗辞書の分割方法を検討するときに達成しようとしていることと関連していると私は考えていません。

+0

トピックはありませんが、OS5をターゲットにしている場合は、組み込みのJSONパーサー – Devraj

+0

を使用できます.iOS4もサポートしています。私の意見では、両方のiOSに同じプロセスを使用することもできます。 –

+0

@SebastienPeek fair enough :) – Devraj

答えて

1

まず、最上位の要素はオブジェクトではなく配列であることに注意してください。したがって:

NSArray *object = [parser objectWithString:[response asString] error:nil]; 

と私は変数名としてcompaniesの代わりobjectを使用したい:

NSDictionary *object = [parser objectWithString:[response asString] error:nil]; 

はする必要があります。

第2に、-valueForKey:を使用するときは注意が必要です。配列に送られると、の別の配列がkey引数に対応する値を返します。 Key-Valueコーディングに精通していない場合は、NSDictionaryの正規のメソッドを使用して、特定のキーに関連付けられたオブジェクトを返します。-objectForKey:

-valueForKey:の代わりに-objectForKey:を使用した場合、プログラムを実行しているときにこの構造的なエラーが発生していることに気がつきました。

次のように心の中で、これらの二つの点で、あなたはJSONデータをナビゲートすることができますが:-valueForKey:を使用する前に、Difference valueforKey objectForKeyKey-Value Coding Programming Guide

NSArray *companies = [parser objectWithString:[response asString] error:nil]; 
for (NSDictionary *company in companies) { 
    NSDictionary *companyDetails = [company objectForKey:@"Company"]; 
    NSDictionary *relations = [company objectForKey:@"relations"]; 
    NSArray *stores = [relations objectForKey:@"store"]; 

    for (NSDictionary *store in stores) { 
     NSString *restaurantName = [store objectForKey:@"restaurant_name"]; 
     … 
    } 

私はスタックオーバーフロー上のこの他の質問を読んでお勧めします。

+0

完璧に動作します。私の唯一の問題は、NSMutableArrayにNSDictionary *ストアを追加して、後で取り出すことができるようにすることです。[NSMutableArray addObject:store]を実行できますか? –

+1

@Sebastien確かに。もう一つの選択肢は、 'stores'配列の可変コピーを作成することです。 'NSMutableArray * storesArray = [stores mutableCopy]'です。 –

+0

ありがとう、本当に非常に役立つ! –