2016-08-19 5 views
-1

Open Weather APIを使用しています。最高の正確な結果が得られるようにcityIDで検索することをお勧めします。私はCLPlacemarkを使用してcityNameを取得しています。そのcityNameを取得するためにOpen Weatherによって提供されるJSONファイル( "city.list.us.json")でそのcityNameを検索します。私はあなたがファイル全体を読んでいましたが、ここで私は行ずつ読み込み、cityIDを得るために、私cityNameに対してそれをチェックしなければならない多数の例を見てきましたOpen Weatherで提供されているSwift-2を使用してJSONファイルを1行ずつ読み込む

{"_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}} 

:それJSONファイルには、次のようになります。ここに私に道を示すことができれば、本当に感謝しています。

+0

[Swiftでファイル/ URLを1行ずつ読む](http://stackoverflow.com/questions/24581517/read-a-file-url-line-by-line-in-swift)の可能な複製) –

+3

これは有効なJSONではありません。それは10の辞書ですが、JSONファイルのルートは配列または辞書でなければなりません。私はこれが実際に10ディクショナリの配列であると推測します。 – Alexander

+0

@AlexanderMomchliov No.これは約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ÄPatelAPIのバルクデータを使用しています。つまり、手動でファイルをダウンロードした後、希望の出力を得るためにプログラムまたは手動で配列に変換する必要があります。 –

0

これは有効なJSONではありません。それは10の辞書ですが、JSONファイルのルートは配列または辞書でなければなりません。

文字列全体を[ ... ]にラップして、辞書の配列に変換することができます。これを通常の解析が可能です。

パフォーマンスが問題になる場合は、ファイルを行単位で解析する方法については、her eの手順に従ってください。ファイル内の各行を繰り返して、あなたが探している街の古い文字列検索を行います。そうすれば、使用しないJSONの解析時間を計算に費やすことはありません。

関連する問題