2013-05-20 157 views
2

multilined JSON我有大數據這樣的JSON文件:解析目標C

[{"pkg_id": 385 ,"pkg_name":" 10OZ NR 1/24  "}, 
    {"pkg_id": 822 ,"pkg_name":" 12OZ CN   "}, 
    {"pkg_id": 422 ,"pkg_name":" 12OZ CN 6/4  "}] 

我如何在一個陣列獲得的pkg_id名單。

我明白,如果有隻有一排,然後我可以做

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 
NSArray* array = [jsonDict objectForKey:@"pkg_id"]; 

如何去多行。如果我必須開始一個循環,如何枚舉字典中的行數?

也試過。

for (NSDictionary *status in jsonDict) 
{ 
    [newArray addObject:[status objectForKey:@"pkg_id"]]; 
} 

NSLog(@"%@", newArray);外循環給出空值。

+2

你所顯示的那條JSON數據是數組的一部分。你應該顯示整個結構,這樣我們可以告訴你如何獲得這個數組(你不需要從頭開始創建它)。 –

+0

整個事情太大了,只是編輯了一個問題,讓你有更好的想法 – CalZone

+0

看起來像一個數組的字典,所以你的代碼不會工作..檢查jsonDict的類......我敢打賭這是一個數組。 –

回答

2

鑑於原始JSON,我們可以將其轉換爲一個NSDictionary或NSArray的是這樣的:

NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 
id jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 

此時,js onDict將是,NSArrayNSDictionary。如果它是一個字典,則可以遍歷這些鍵,如果它是一個數組,則可以遍歷這些索引。通過的NSArray的指數

for(id key in [jsonDict allKeys]) { 
    ... 
} 

迭代:

通過的NSDictionary的按鍵迭代

for(id element in jsonDict) { 
    ... 
} 

你的情況,你有一個NSArray。如果你想得到所有pkg_ids的列表,那麼你可以這樣做:

NSMutableArray *pkg_ids = [NSMutableArray array]; 
for(NSDictionary *dictionary in jsonDict) { 
    [pkg_ids addObject:[dictionary [email protected]"pkg_id"]]; 
} 
// Now pkg_ids = {385, 822, 422} 
// Note, this is untested -- there may be minor tweaks but the idea stays the same. 
+0

如果你說你在循環之後打印pkg_ids時會得到空值,你可以NSLog(@「%@」,dictionary);在循環內部並報告輸出? –

+0

這裏列出所有的值:'for(NSDictionary * status in jsonDict) {NSLog(@「%@」,[status objectForKey:@「pkg_id」]);}' – CalZone

+0

你也可以輸出字典嗎? –

1

使用NSArrays的一個有趣的小功能:

$ cat test.m 
#import <Foundation/Foundation.h> 

int main(void) { 
    NSArray *ary = @[@{@"pkg_id": @385 ,@"pkg_name":@" 10OZ NR 1/24  "}, 
      @{@"pkg_id": @822 ,@"pkg_name":@" 12OZ CN   "}, 
      @{@"pkg_id": @422 ,@"pkg_name":@" 12OZ CN 6/4  "}]; 
    NSLog(@"%@", [ary valueForKeyPath:@"pkg_id"]); 
} 
$ clang -framework Foundation test.m 
$ ./a.out 
2013-05-20 17:27:45.798 a.out[2793:707] (
    385, 
    822, 
    422 
) 
$                    0 

從實際字符串:

$ cat test.m 
#import <Foundation/Foundation.h> 

NSString *jsonString = // Next line 
@"[{\"pkg_id\": 385 ,\"pkg_name\":\" 10OZ NR 1/24  \"}," 
" {\"pkg_id\": 822 ,\"pkg_name\":\" 12OZ CN   \"}," 
" {\"pkg_id\": 422 ,\"pkg_name\":\" 12OZ CN 6/4  \"}]"; 

int main(void) { 
    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; 
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil]; 

    NSLog(@"%@", [jsonArray valueForKeyPath:@"pkg_id"]); 
} 
$ clang -framework Foundation test.m 
$ ./a.out 
2013-05-20 18:30:34.346 a.out[2988:707] (
    385, 
    822, 
    422 
) 
$                    0 
+0

我無法通過該問題的循環向數組添加值。 – CalZone

+0

您不會爲此解決方案的任何值添加值。如果你的問題中的JSON是整個事情,你的'jsonDict'實際上是一個數組,我們把它當作'ary'。否則,遍歷JSON到那個點。 – Kevin

+0

yupp,即得到解決。但感謝您的答案。你只是給了我一些新的玩法。 ;-) – CalZone