2013-05-20 105 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