在目标c中解析多线json

时间:2013-05-20 22:08:32

标签: ios objective-c json

我有一个包含大量数据的json文件:

 [{"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 个答案:

答案 0 :(得分:2)

给定原始JSON,我们可以将它转换为NSDictionary或NSArray,如下所示:

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

此时,jsonDict将 nil NSArray NSDictionary 。如果是字典,则可以遍历密钥,如果是数组,则可以遍历索引。

迭代 NSDictionary

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

迭代 NSArray 的索引:

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

在您的情况下,您有一个NSArray。如果你想获得所有pkg_ids的列表,那么你可以这样做:

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

答案 1 :(得分: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