2017-01-09 5 views
0

スウィフト3、Xcode8.2.1、スウィフト3解析値

私はプロジェクト内のJSONファイルから特定の値を抽出しようとしています。ファイルの名前はcity.list.jsonで、次のようにJSONファイルの構文は次のとおりです。

{"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}} 
{"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}} 

私が持っている入力が国名であると私は返されたid値または関連する国コードを必要とします文字列として。私が書いた

"Type 'Any?' has no subscript members",

方法:

private func findCountryCodeBy(location: String)->String{ 
    var result:String=""; 
    let bundle = Bundle(for: type(of: self)); 
    if let theURL = bundle.url(forResource: "city.list", withExtension: "json") { 
     do { 
      let data = try Data(contentsOf: theURL); 
      if let parsedData = try? JSONSerialization.jsonObject(with: data, options:[]) as! [String:Any] { 
       result = parsedData["_id"][location][0] as! String; 
      } 
     } catch { 
      print(error); 
      result = "error"; 
     } 
    } 
    return result; 
} 

答えて

0

有効なJSONではありません

私はエラーを取得します。

[ 
    {"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}}, 
    {"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}} 
] 

すなわち、カンマで区切られた各項目に角括弧で囲まれたリスト:私は、最も近い有効なJSONと同等のようなEITHER JSON リストになると思います。 :

{ 
    "707860": {"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}}, 
    "519188": {"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}} 
} 

すなわち、キーと中括弧で囲まれた辞書(このケースでは、私はキーとしてあなた_idを使用しました)と:

OR JSON 辞書値(の後のすべての辞書の辞書)

(改行、タブ、空白は無視されています。私が行ったことを明白にするためにそれらを含んでいます)

私は、辞書のバージョンがあなたのコードに合っているかもしれないと思っていますが、データで何をしたいのかによって異なります。リストはいくつかの状況に適しています。

ファイルからJSONを読み込むだけの簡単なPythonスクリプトを書いています(それ以外は何もしていません)、それはあなたが持っていたJSON以外の構文解析エラーを生成しましたが、上記のJSONの例をご覧ください。

注:読んでいるファイルの形式を制御できない場合(つまり、他の形式では生成できない他のソースからファイルを受け取っている場合)は、あなたがそれを有効なJSONにするためにそれを受け取った後のファイルの形式、またはそれを読むためにJSONSerialization以外の何かを使わなければならないでしょう。 }{または}\n{をすべて},{に置き換えて、最初に[、最後に]と入力して修正することができます。これは、この特定のファイルをリストの有効なJSONに変換する作業を行う必要があります。辞書に変換するのは少し複雑です。

あなたは理想的ですが、ファイル形式を自分で制御することができます。その場合は、最初に正しいJSONを生成するためにファイルを生成するものを変更してください。

あなたが有効なJSONを持っているし、あなたのparsedData変数にそれを解析されたら、あなたは、この行を修正する必要があります:

result = parsedData["_id"][location][0] as! String; 

locationはJSONで_id文字列の等価であると仮定すると、 location_id文字列ではない場合、しかし、

result = parsedData[location]["country"]; 

:あなたは上記のJSONの辞書のバージョンを使用してのようなもので、その行を置き換えることができるかもしれ上記のJSONのリストバージョンを使用する方が良いでしょう。forループを使用して各リスト項目の値を比較してください(またはlocationが実際に関連するJSONの辞書版を使用してください)。 JSON)。