2017-06-20 6 views
0

Swift 3とXcode8でGETリクエストを作成しようとしましたが、GETリクエストからMain.Storyboardに戻ってきたデータが出力されませんでした。私が得るのは、返されたすべてのJSONがXcode8のコンソールにあることだけです。Swift 3 GETリクエストで返された値を表示できません

JSONのスニペットがXcode8で私の要求と共に返されます。私は "@encoding"と "@version"にアクセスすることができますが、他のすべてにアクセスすることはできず、理由を把握することができません。これがウェブベースの設定だった場合は、変数を宣言してsomeObject.petfinder [1] .sheltersなどと等しく設定することができます。

これは私の要求しているコードです。入力フィールドを作成してURLを構築し、NSDictionaryを使用してそれを返します。

私はコンソールに戻って取得エラーは、次のとおりです。

「致命的なエラー:予期せたオプションの値をアンラップしながら、ゼロ 2017年6月20日12:15:49.392688 PetFinder [47445:9486946]致命的なエラー:予期せずに任意の値を「アンラップしながら、nilを見つけ

// SEND HTTP GET REQUEST 

    // DEFINE SERVER SIDE SCRIPT URL 
    let scriptUrl = "https://api.petfinder.com/" 
    let methodType = "shelter.find" 
    let apiKey = "?key=0000000000000000000000000" 
    let urlWithParams = scriptUrl + methodType + apiKey + "&location=\(shelterZip)&format=json" 


    // CREATE NSURL Object 
    let myUrl = NSURL(string: urlWithParams) 

    // CREATE URL REQUEST 
    let request = NSMutableURLRequest(url:myUrl! as URL); 

    // REQUEST METHOD - GET/POST 
    request.httpMethod = "GET" 

    // RUN HTTP REQUEST 
    let task = URLSession.shared.dataTask(with: request as URLRequest) { 
     data, response, error in 

     if error != nil { 
      print("error \(error!)") 
       return 
     } 

    // PRINT OUT RESPONSE STRING 
    let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
    print("responseString = \(String(describing: responseString))") 


    // CONVERT RECEIVED JSON TO NSDictionary 
     do { 
      if let convertedJsonIntoDict = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary { 

       // Print out dictionary 
       print(convertedJsonIntoDict) 

       // Get value by key 
       let shelterName = convertedJsonIntoDict["shelters"] as? [String: Any] 

       for(key, pair) in convertedJsonIntoDict { 
        print("-->\(key) \(pair)") 
       } 
       print(shelterName!) 

      } 
     } catch let error as NSError { 
      print(error.localizedDescription) 
     } 

    } 

    task.resume() 

    } 

//のTOP

{ 
"@encoding" = "iso-8859-1"; 
"@version" = "1.0"; 
petfinder =  { 
    "@xmlns:xsi" = "http://www.w3.org/2001/XMLSchema-instance"; 
    "@xsi:noNamespaceSchemaLocation" = "http://api.petfinder.com/schemas/0.9/petfinder.xsd"; 
    header =   { 
     status =    { 
      code =     { 
       "$t" = 100; 
      }; 
      message =     { 
      }; 
     }; 
     timestamp =    { 
      "$t" = "2017-06-20T16:15:49Z"; 
     }; 
     version =    { 
      "$t" = "0.1"; 
     }; 
    }; 
    lastOffset =   { 
     "$t" = 25; 
    }; 
    shelters =   { 
     shelter =    (
          { 
       address1 =      { 
       }; 
       address2 =      { 
       }; 
       city =      { 
        "$t" = Nebraska; 
       }; 
       country =      { 
        "$t" = US; 
       }; 
       email =      { 
        "$t" = "[email protected]"; 
       }; 
       fax =      { 
       }; 
       id =      { 
        "$t" = NE117; 
       }; 
       latitude =      { 
        "$t" = "13.004"; 
       }; 
       longitude =      { 
        "$t" = "-31.449"; 
       }; 
       name =      { 
        "$t" = WOOF COMPANY; 
       }; 
       phone =      { 
       }; 
       state =      { 
        "$t" = NE; 
       }; 
       zip =      { 
        "$t" = 68001; 
       }; 
      }, 
+0

を探している値JSONをお読みくださいれます。 'シェルター'は、ルートオブジェクトではなく、キー 'petfinder'の辞書のキーです。したがって、 'shelterName'は' nil'であり、クラッシュを引き起こします。スニペットはJSONではなく、Swiftコレクションタイプの文字列表現です。 – vadian

+0

私はそれが鍵であることを知っています、私はそれが鍵/対の価値にアクセスすることができません。私はconvertedJsonIntoDict [keyPath: "petfinder.shelters.shelter"]を試みましたが、それはどちらもうまくいきません。 Xcode8で私が見ていることを明確にしてくれてありがとう。 – VanCoon

+0

私はself.shelterResult.stringValue = convertedJsonIntoDict ["シェルター"]を返しました "タイプ 'NSDictionary'のタイプの値に 'String'タイプのインデックスを添字できません – VanCoon

答えて

0

まずから返されるJSONの抜粋すべて - いつものように

  • スウィフトではNSDictionaryを使用しないでください。あなたは型情報を捨てます。
  • ネイティブのSwiftの対応がある場合はNSURLNS(Mutable)URLRequestのようなFoundationクラスを使用しないでください。
  • GETリクエストにはURLRequestがまったく必要なく、デフォルトです。

第2の理由は、便宜上、タイプエイリアスを使用することです。

typealias JSONDictionary = [String:Any] 

このコードは、キーを抽出することになって、あなたが

let scriptUrl = "https://api.petfinder.com/" 
let methodType = "shelter.find" 
let apiKey = "?key=0000000000000000000000000" 
let urlWithParams = scriptUrl + methodType + apiKey + "&location=\(shelterZip)&format=json" 

// CREATE NSURL Object 
let myUrl = URL(string: urlWithParams)! 

// RUN HTTP REQUEST 
let task = URLSession.shared.dataTask(with: myUrl) { data, response, error in 

    if error != nil { 
     print("error \(error!)") 
     return 
    } 

    // CONVERT RECEIVED JSON TO NSDictionary 
    do { 
     if let rootDictionary = try JSONSerialization.jsonObject(with: data!) as? JSONDictionary, 
      let petfinder = rootDictionary["petfinder"] as? JSONDictionary { 

      // Get value by key 
      if let shelters = petfinder["shelters"] as? JSONDictionary, 
       let shelter = shelters["shelter"] as? [JSONDictionary] { 

       for item in shelter { 
        for (key, value) in item { 
         print("-->\(key) \(value)") 
        } 
       } 
      } 
     } 

    } catch { 
     print(error.localizedDescription) 
    } 
} 
task.resume() 
+0

私は理解しています。なぜself.shelterResult.stringValue = " - > \(シェルター["名前 "])を書くことができないのか不明確で、各シェルターの名前をテキストフィールドに表示しますが、それは私の元の質問。 – VanCoon

関連する問題