2011-10-28 89 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數據源)。

任何幫助將非常感謝讓商店節點分開。

編輯 至於要求,整個代碼解析:

 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足夠:) – Devraj

回答

1

首先,請注意,您的頂級元素是一個數組,而不是一個對象。因此:

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

應該是:

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

,我會用companies代替object作爲變量名。

其次,使用-valueForKey:時一定要小心。當發送到一個數組時,它返回另一個數組,其中包含對應於鍵參數的值。除非您熟悉Key-Value編碼,否則請使用NSDictionary中的規範方法返回與給定鍵關聯的對象:-objectForKey:

如果您使用-objectForKey:而不是-valueForKey:,那麼在運行程序時您會注意到這種結構錯誤。

考慮到這兩點,你可以瀏覽你的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:之前Difference valueforKey objectForKeyKey-Value Coding Programming Guide

+0

完美的作品。我唯一的問題是,比如說我想將NSDictionary *存儲添加到NSMutableArray中,這樣我就可以在以後將它拉出來,可以只做一個[NSMutableArray addObject:store]? –

+1

@Sebastien當然。另一種選擇是創建'stores'數組的可變副本,例如'NSMutableArray * storesArray = [存儲mutableCopy]'。 – 2011-10-28 04:03:06

+0

謝謝,確實很有幫助! –