Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将iOS中的一列JSON文件解析为数组?_Ios_Xcode_Json - Fatal编程技术网

将iOS中的一列JSON文件解析为数组?

将iOS中的一列JSON文件解析为数组?,ios,xcode,json,Ios,Xcode,Json,我已经使用JSON从我的Web服务器获取了一个位置列表,并从应用程序中抓取了文件。 我知道它可以得到etc,因为我也将其打印到了NSLog中,并在日志窗口中以JSON显示 我的下一步是将这些值放入数组,以便最终将它们显示到UIPickerView中 有人对如何从当前JSON文件将它们最好地放入数组有什么建议吗 键是“name” 我一辈子都不能让它循环并添加到数组中;也许我做错了 JSON数据如下所示: [{"Name":"Aberdaron"},{"Name":"Aberdeen"},{"Nam

我已经使用JSON从我的Web服务器获取了一个位置列表,并从应用程序中抓取了文件。 我知道它可以得到etc,因为我也将其打印到了NSLog中,并在日志窗口中以JSON显示

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

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

键是“name”

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

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);

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

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

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

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

在数组上使用时,valueForKey将获取该键的对象的所有值。因为您的对象是
NSDictionary
s,所以这些值就是您所需要的

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

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

现在,nameArray是一个数组,它包含了与示例中给出的“name”键对应的所有值。

谢谢。这似乎可以正常工作,但由于某些原因,没有键值,因此它抛出了一个错误。您能详细说明一下吗?+1。我不知道为什么会被否决。这应该能很好地工作。@LyconalBest,你能解释一下为什么没有键值吗?很明显,字典里有一个键,他们就是这样写的work@jmstone,xcode错误地向我发送消息说没有可用的键值。您好,这似乎可以正常工作,但引发了一个错误“no visible@interface for'NSArray'声明选择器'addObject:'”我有一个拼写错误,我将其声明为NSArray,相反,应该是可变的:)NSArray具有与上述答案相同的功能。对于已经存在的东西,你不需要新的分类<代码>NSArray*nameArray=[json valueForKey:@“Name”]与上面相同。是的,正如我在下面的答案中所述,在这个答案发布前一小时。