2

次のような大きなデータを含む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配列内のリストを取得するにはどうすればよいですか。

行が1つしかない場合は理解できます

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);外側のループでは null 値が返されます。

4

2 に答える 2

2

生の JSON を指定すると、次のように NSDictionary または NSArray に変換できます。

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

この時点で、 jsonDict はnilNSArray、または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.
于 2013-05-20T22:36:24.073 に答える
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
于 2013-05-20T22:29:36.883 に答える