2016-06-03 4 views
0

Ich arbeite an einer Wetter-App, die JSON-Daten analysiert und den Text meiner Beschriftung auf den Temp-Wert der JSON-Anfrage setzt. Ich habe den Wert von ID aus dem Wetter-Objekt-Array, aber die Temp ist nicht in einem Array, es ist nur ein Objekt. Kann mir bitte jemand sagen, wo ich falsch liege? Mein Wert repliziert nil, weil ich es nicht richtig hole. Hier ist mein Schnipsel und JSON. HierSwift und JSON analysieren nur ein Objekt und kein Array

@IBAction func getWeather(sender: AnyObject) { 
     let requestURL: NSURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=MYAPPID")! 
     let urlRequest: NSMutableURLRequest = NSMutableURLRequest(URL: requestURL) 
     let session = NSURLSession.sharedSession() 
     let task = session.dataTaskWithRequest(urlRequest) { 
      (data, response, error) -> Void in 

      let httpResponse = response as! NSHTTPURLResponse 
      let statusCode = httpResponse.statusCode 

      if (statusCode == 200) { 
       print("JSON Downloaded Sucessfully.") 

       do{ 

        let json = try NSJSONSerialization.JSONObjectWithData(data!, options:.AllowFragments) 

        if let today = json["weather"] as? [[String: AnyObject]] { 
         //this is pulling 4 key value pairs 
         for weather in today { 

          //this works 
          let id = weather["id"]?.stringValue 
          self.trumpDescription.text=id; 
          print(id) 

          //this is where I am confused it changes from an array to just an object 
          let temp = json["temp"] as? String 
          self.currentTempView.text=temp; 
          print(temp) 
         } 

        } 

       } 

       catch { 
        print("Error with Json: \(error)") 
       } 

      } 
     } 

     task.resume() 
    }` 

ist die JSON:

{ 
    "coord": { 
    "lon": 138.93, 
    "lat": 34.97 
    }, 
    "weather": [ 
    { 
    "id": 803, 
    "main": "Clouds", 
    "description": "broken clouds", 
    "icon": "04n" 
    } 
    ], 
    "base": "cmc stations", 
    "main": { 
    "temp": 292.581, 
    "pressure": 1019.48, 
    "humidity": 99, 
    "temp_min": 292.581, 
    "temp_max": 292.581, 
    "sea_level": 1028.92, 
    "grnd_level": 1019.48 
    }, 
    "wind": { 
    "speed": 5.36, 
    "deg": 237.505 
    }, 
    "clouds": { 
    "all": 64 
    }, 
    "dt": 1464964606, 
    "sys": { 
    "message": 0.0037, 
    "country": "JP", 
    "sunrise": 1464895855, 
    "sunset": 1464947666 
    }, 
    "id": 1851632, 
    "name": "Shuzenji", 
    "cod": 200 
    } 
+0

Der Wert für 'temp' ist in einem Objekt. http://jsonlint.com/ – Adam

+0

Temp ist nicht im Wetter ... es ist ein Objekt der wichtigsten –

+0

werfen Sie einen Blick auf diese, [generierte Modell für openweathermap] (https://github.com/romainmenke/Jenerator/blob/ master/examples/openweather/openweathermap.swift) Es könnte Ihnen etwas Zeit sparen. –

Antwort

2

Es sieht aus wie es

if let main = json["main"] as? NSDictionary { 
    let temp = main["temp"] as! String 
    print(temp) 
} 
+0

Dank Ihres Beispiels verstehe ich jetzt die Logik. Vielen Dank. –

+0

Gern geschehen! Froh, dass es geholfen hat. –

0

Statt dessen sollte:
let temp = json["temp"] as? String

Versuchen Sie folgendes:

if let main = json["main"] as? [String: AnyObject] { 
    let temp = main[temp]?.stringValue 
    print(temp) 

    //alternatively you can try this as per your convenience of data type 
    let tempNew = main[temp]?.doubleValue 
    print(tempNew) 
} 
Verwandte Themen