2016-08-19 66 views
-1

我正在使用Open Weather API,并且它建议使用cityID进行搜索以获得最佳和准确的结果。我正在使用CLPlacemark获取cityName,并且会根据Open Weather提供的JSON文件(“city.list.us.json”)中的cityName进行搜索以获取cityID。这JSON文件看起来是这样的:使用Open Weather提供的Swift-2逐行读取JSON文件

{"_id":4070245,"name":"Jones Crossroads","country":"US","coord":{"lon":-85.484657,"lat":31.21073}} 
{"_id":4344544,"name":"Vernon Parish","country":"US","coord":{"lon":-93.183502,"lat":31.11685}} 
{"_id":4215307,"name":"Pennick","country":"US","coord":{"lon":-81.55899,"lat":31.313}} 
{"_id":5285039,"name":"Black Bear Spring","country":"US","coord":{"lon":-110.288139,"lat":31.386209}} 
{"_id":4673179,"name":"Bee House","country":"US","coord":{"lon":-98.081139,"lat":31.40266}} 
{"_id":4047656,"name":"Provo","country":"US","coord":{"lon":-94.107697,"lat":34.037609}} 
{"_id":5493998,"name":"Tejon","country":"US","coord":{"lon":-105.28611,"lat":34.58979}} 
{"_id":5815135,"name":"Washington","country":"US","coord":{"lon":-120.501472,"lat":47.500118}} 
{"_id":5391891,"name":"San Dimas","country":"US","coord":{"lon":-117.806732,"lat":34.106682}} 
{"_id":4056099,"name":"Coffee County","country":"US","coord":{"lon":-86.000221,"lat":31.41683}} 

我见过无数的例子,你会读整个文件,但在这里我不得不按行读入行,并检查它,我的cityName得到cityID。如果你能在这里向我展示方式,我会非常感激。

+0

可能重复[在Swift中逐行读取文件/ URL](http://stackoverflow.com/questions/24581517/read-a-file-url-line-by-line-in-swift ) –

+3

这不是有效的JSON。这是10个字典,而JSON文件的根必须是数组或字典。我猜这实际上是10个字典的数组,对吗? – Alexander

+0

@AlexanderMomchliov号这是一个约20000行的JSON文件,我认为每行都是一本字典。 –

回答

0

样品JSON阵列:我假设你有字典的数组

[{"_id":4070245,"name":"Jones Crossroads","country":"US","coord":{"lon":-85.484657,"lat":31.21073}}, 
{"_id":4344544,"name":"Vernon Parish","country":"US","coord":{"lon":-93.183502,"lat":31.11685}}, 
{"_id":4215307,"name":"Pennick","country":"US","coord":{"lon":-81.55899,"lat":31.313}}, 
{"_id":5285039,"name":"Black Bear Spring","country":"US","coord":{"lon":-110.288139,"lat":31.386209}}, 
{"_id":4673179,"name":"Bee House","country":"US","coord":{"lon":-98.081139,"lat":31.40266}}, 
{"_id":4047656,"name":"Provo","country":"US","coord":{"lon":-94.107697,"lat":34.037609}}, 
{"_id":5493998,"name":"Tejon","country":"US","coord":{"lon":-105.28611,"lat":34.58979}}, 
{"_id":5815135,"name":"Washington","country":"US","coord":{"lon":-120.501472,"lat":47.500118}}, 
{"_id":5391891,"name":"San Dimas","country":"US","coord":{"lon":-117.806732,"lat":34.106682}}, 
{"_id":4056099,"name":"Coffee County","country":"US","coord":{"lon":-86.000221,"lat":31.41683}}] 

筛选数据代码:下面的代码读取使用可以过滤使用的ID CITYNAME提供方式相同的JSON文件和过滤数据或其他键。

// *** Read JSON file *** 
let path = NSBundle.mainBundle().pathForResource("weather", ofType: "json") 
let data = NSData(contentsOfFile: path!) 

// *** Declare array *** 
var arr:[AnyObject] 

// *** Apply filter on array with filter string *** 
let filterCityName = "San Dimas" 
do { 
    arr = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) as! [AnyObject] 
    let filteredObject = arr.filter({ 
     $0["name"] as! String == filterCityName //access the value to filter 
    }) 
    // *** Print result *** 
    print(filteredObject) 
} 
catch{ 
    print("Exception") 
} 
+0

恐怕如果按照原样传递JSON,您将无法获得您期望的数组。你有没有测试过相同的JSON?我认为根的JSON数据必须是一个数组或字典。在这里,我的JSON只是每行的单独字典。这不是我们的错,但我认为API提供商没有给予足够的关注。 OpenWeather这样的着名天气API如何能够做到这样的错误?这是另一回事。 –

+0

@VändänÄPatel看看,我已经更新了JSON并制作了字典数组。我假设你也有这样的数据结构。 –

+0

@VändänÄPatel您正在使用来自API的批量数据,这意味着您已经手动下载文件,然后您需要通过编程或手动方式将其转换为Array以实现所需的输出,否则无法实现。 –

0

这不是有效的JSON。这是10个字典,而JSON文件的根必须是数组或字典。

您可以将整个字符串包装在[ ... ]中,以将其转换为可正常分析的字典数组。

如果性能是一个问题,请尝试按照说明her e了解如何逐行解析文件。遍历文件中的每一行,并为您正在寻找的城市做一个普通的旧字符串搜索。这样,您不会花费吨计算时间解析JSON,您将不会使用。