2

我已经设法使用 JSON 从我的网络服务器获取位置列表,并从应用程序中获取文件。我知道它可以得到等,因为我也打印了 NSLog,它出现在日志窗口中的 JSON 中。

我的下一步是将这些值放入一个数组中,以便最终将它们显示到 UIPickerView 中。

有人对我如何最好地将它们从当前 JSON 文件中放入数组有任何建议吗?

关键是“名称”。

我一辈子都无法让它循环并添加到数组中;也许我做错了?

JSON 数据如下所示:

[{"Name":"Aberdaron"},{"Name":"Aberdeen"},{"Name":"Aberdovey"},{"Name":"Aberporth"},{"Name":"Aberystwyth"},{"Name":"Albert-Bridge"},{"Name":"Aldeburgh"},{"Name":"Allington-Lock"},{"Name":"Alloa"},{"Name":"Amble"},{"Name":"Amlwch"},{"Name":"Annan-Waterfoot"},{"Name":"Anstruther-Easter"},{"Name":"Applecross"},{"Name":"Appledore"},{"Name":"Arbroath"},{"Name":"Ardglass"},{"Name":"Ardnave-Point"},{"Name":"Ardrossan"},{"Name":"Arklow"},{"Name":"Arnside"},{"Name":"Arrochar"}]

我到目前为止的代码是:

    NSString * urlString = [NSString stringWithFormat:@"http://localhost:8888/Locations.php"];
NSURL * url = [NSURL URLWithString:urlString];
NSData * data = [NSData dataWithContentsOfURL:url];
NSError * error;
NSMutableArray *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
NSLog(@"%@",json);
4

2 回答 2

0

因此,您的 JSON 已经作为一个数组下降(通过您的键/值对包含在硬括号中这一事实来表示[ ])。假设您没有使用任何第三方 JSON 消费库,您可以使用 iOS 的内置NSJSONSerialization将 JSON 数据转换为 Objective-C 对象。你可能会想要类方法+ (id)JSONObjectWithData:(NSData *)data options:(NSJSONReadingOptions)opt error:(NSError **)error,它只需要一个指向某个 NSData 的指针、一个选项标志和一个指向 NSError 的指针。

请注意该方法返回 type id,但由于您的 JSON 在数组中出现,请继续将其粘贴在数组变量中。NSDictionary现在,您有一个可以循环遍历的 s 数组。假设您的数组是 named jsonDataArray,将所有名称放入您的选择器的数组中的代码非常简单。当然,您可以NSMutableArray在初始数组中创建一个 and 循环,将objectForKey:字典中的结果添加到可变数组中。

一个更简单和优雅的方法是一个简单的单行:

NSArray *names = [jsonDataArray valueForKey:@"Name"];

在数组上使用时, valueForKey 将获取该键的对象的所有值。由于您的对象是NSDictionarys,因此值将是您所需要的!

于 2012-12-09T18:41:10.257 回答
0

第一个答案很好地描述了如何解析数组并将其放入本机对象中。我写了一个函数,它是 NSString 上的一个类别,你可以在下面使用。假设您的数组存储在一个名为 json 的变量中,我将使用以下代码,给定您的示例:

NSMutableArray *nameArray = [NSMutableArray array];
for (NSDictionary *dictionary in json)
{
    [nameArray addObject:[dictionary valueForKey:@"Name"]];
}
NSLog(@"%@",nameArray);

现在 nameArray 是与您的示例中给出的“名称”键对应的所有值的数组。

于 2012-12-09T19:00:17.530 回答