JSONの解析 - SBJsonParserの問題

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

さて、私が解析している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" = "";
            id = 1;
            "restaurant_name" = Dubai;
        },
                    {
            "brief_description" = "";
            id = 2;
            "restaurant_name" = Test2;
        }
    );
 }
)

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

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

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

店舗ノードを別々にするのに役立つでしょう。

EDIT As asked for, entire code for parsing:

        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,
@SebastienPeekフェア十分:)
追加された 著者 Devraj,
私たちはiOS4もサポートしています。私の意見では、両方のiOSに同じプロセスを使用することもできます。
追加された 著者 Sebastien Peek,

1 答え

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

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

次のようにする:

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

変数名として object の代わりに企業を使用したいと思います。

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

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

この2つの点を念頭に置いて、次のようにJSONデータをナビゲートできます。

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"];
        …
    }

差分valueforKey objectForKey

1
追加された
@セバスチャン確か。もう1つの選択肢は、 stores 配列の可変コピーを作成することです。 NSMutableArray * storesArray = [stores mutableCopy]
追加された 著者 user557219,
完璧に動作します。私の唯一の問題は、NSMutableArrayにNSDictionary *ストアを追加して、後で取り出すことができるようにすることです。[NSMutableArray addObject:store]を実行できますか?
追加された 著者 Sebastien Peek,
ありがとう、本当に非常に役立つ!
追加された 著者 Sebastien Peek,