2016-06-02 28 views
2

Ich arbeite an einer iOS-Wetter-App und brauche etwas Hilfe, um einige Werte mit JSON zu bekommen. Ich versuche, den Wert von ID in das Wetterobjekt zu ziehen. Ich bekomme einen Wert von Null, wenn ich debugge. Könnte mir bitte jemand mit der Logik helfen? Hier ist die JSON-Anfrage und Swift-Code.Swift JSON Parsing

{ 
    "coord":{ 
     "lon":138.93, 
     "lat":34.97 
    }, 
    "weather":[ 
     { 
      "id":800, 
      "main":"Clear", 
      "description":"clear sky", 
      "icon":"01n" 
     } 
    ], 
    "base":"cmc stations", 
    "main":{ 
     "temp":292.181, 
     "pressure":1005.21, 
     "humidity":100, 
     "temp_min":292.181, 
     "temp_max":292.181, 
     "sea_level":1014.59, 
     "grnd_level":1005.21 
    }, 
    "wind":{ 
     "speed":3.41, 
     "deg":78.0005 
    }, 
    "clouds":{ 
     "all":0 
    }, 
    "dt":1464801034, 
    "sys":{ 
     "message":0.003, 
     "country":"JP", 
     "sunrise":1464723086, 
     "sunset":1464774799 
    }, 
    "id":1851632, 
    "name":"Shuzenji", 
    "cod":200 
} 

Hier ist mein Swift-Schnipsel:

let requestURL: NSURL = NSURL(string: "http://api.openweathermap.org/data/2.5/weather?lat=35&lon=139&appid=6361e893fa064b1bfeaca686cd0929cc")! 
      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 { 

           let id = weather["id"] as? String 


           self.trumpDescription.text=id; 
           print(id) 

            } 

           } 
          } 

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

       } 
      } 

      task.resume() 
     } 
+0

Bitte entfernen Sie diese Einrückung: | – Alexander

Antwort

-1

versuchen Sie dies in Ihrem Code:
let id = weather["id"]?.stringValue

statt dessen:
let id = weather["id"] as? String

Und die Magie sehen!

Einfüg.Nummer Erklärung:
Da diese Antwort für Sie gearbeitet, lassen Sie mich Ihnen sagen, warum es getan hat.
Die ID wird als Integer von der Serverseite gesendet. Wenn Sie weather["id"] tun, gibt es Objekt vom Typ AnyObject? zurück. Wenn Sie weather["id"] as? String tun, schlägt das Casting fehl, und Sie wurden gleich null.

+0

Die Magie ist "id" ist zuverlässig "nil" ;-) – vadian

+1

können Sie versuchen, SwiftJSON? Daam einfach! –

+0

Mit SwiftyJSON stürzt der Code wegen des Fragezeichens ab (JSON-Objekte sind nicht optional). Aber das ist irrelevant, weil das OP nicht SwiftyJSON verwendet – vadian

1

Das Problem liegt in Ihrer Besetzung einer Zeichenfolge. Wenn Sie die ID nicht als String darstellen, wird "800" als Int gedruckt.

Wenn Sie die ID aus dem JSON abrufen und in eine Zeichenfolge konvertieren, liest sie die Zeichenfolge und fügt das neue Zeilenzeichen ein.

Ich spielte auf dem Spielplatz

enter image description here

So sind Sie richtig auf den Punkt in der json bekommen, aber Sie müssen Ihre optional auszupacken.

+0

Haben Sie Zeit für eine andere Frage Ich versuche, ein anderes Objekt "temp" in JSON zu analysieren. Gleiche Anfrage. Es ist ein Objekt, kein Array. Können Sie mir helfen, das temporäre Objekt zu bekommen // das ist, wo ich verwirrt bin, es ändert sich von einem Array zu nur einem Objekt lassen Sie temp = json ["temp"] als? Zeichenfolge self.currentTempView.text = temp; print (temp) } –

+0

Ich bin nicht sicher, was Sie damit meinen, ist ein Objekt, kein Array. Arrays sind Objekte? Ich sehe, dass du es als String formst, ist es ein String, den du willst? –

+0

Es tut mir leid, ich lerne. Ich möchte nur den Wert für temp. Das ID-Objekt befindet sich im Array "wether", aber die anderen Objekte befinden sich nicht in einem Array. Sie sind lediglich ein reguläres Objekt. Ich möchte die Temp-Variable eine Zeichenfolge sein –

0

Sie können auch die nil coalescing operator verwenden optionals auszupacken, damit Sie nicht ein Bündel von if lets haben müssen: entweder id auf den Wert oder auf "" gesetzt wird

let id = weather["id"] as? String ?? ""

Was, wenn es doesn t existieren.