2016-09-27 8 views
0

Ich arbeite an einer Datenbankverbindung zwischen Swift 3 und einer PHP-Datei. Senden von Informationen an den PHP wird korrekt in die Datenbank übertragen.swift 3 json funktioniert nicht

Aber ich habe ein Problem, wenn ich Informationen aus der Datenbank in meine xcode drucken möchte.

Ich sende diese json meiner App:

[{"latitude":"51.430536341034","longitude":"5.45947450542819"}, 
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}, 
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}, 
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}, 
{"latitude":"51.4305299243587","longitude":"5.45964865535365"}] 

ich dieses JSON in Xcode mit gedruckt:

print(NSString(data: data!, encoding: String.Encoding.utf8.rawValue)!) 

Ich habe versucht, zwei Optionen, die in anderen Themen an dieser Stelle beschrieben wurden, bei beiden ging es um schnelle 3 und json probleme.

Option 1:

let parsedData = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:AnyObject] 

Wenn ich die app lief, da kommt ist ein Fehler:

Signal SGBRT Could not cast value of type '__NSArrayI' (0x1b2a89cc8) to 'NSDictionary' (0x1b2a8a128).

Option 2:

let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! Dictionary<String, AnyObject> 

Was passiert, ist das gleiche Signal SGBRT mit Fehler:

Could not cast value of type '__NSArrayI' (0x1b2a89cc8) to 'NSDictionary' (0x1b2a8a128).

Ich muss sagen, dass ich kein Profi bin, aber ich bin ein harter Lernstudent ohne Verbindungen, die auch schnell programmieren. Daher hoffe ich hier Hilfe zu bekommen, um diese Funktion der App zu beenden.

Wenn Sie das Thema beantworten, würde ich mich freuen, hier einige andere Codes, die ich ausprobieren sollte. Danke.

+1

Nun, ein Array ist kein Wörterbuch ... !! Sie sollten das Ergebnis als Array von Wörterbüchern darstellen: '[[String: AnyObject]]' 'anstatt nur Wörterbuch. – Moritz

+0

Und Sie brauchen 'allowFragments' nicht. Außerdem ist 'Dictionary ' dasselbe wie '[String: AnyObject]'. – Moritz

+0

@EricAya Nun, das löst diesen spezifischen Fehler, aber ein neues kommt sofort auf. Wenn ich den Breitengrad wie folgt erhalten will: parsedData ["latitude"] wird es Type '[[String: AnyObject]]?' hat keine tiefgestellten Mitglieder .. – royvano

Antwort

0

Ihr JSON sagt eindeutig, dass es sich um ein Array von Wörterbüchern handelt, also sollten Sie es in ein Array von Wörterbüchern [[String: AnyObject]] umwandeln. Bereits in Kommentaren erwähnt. Versuchen Sie unten, es könnte Ihnen helfen:

//First you should check for data whether it has value 
if let data = data { 
    //This gives you an array of dictionaries as per your JSON data. So safer side try to 'guard let' it so that it should not crash if your JSON data is nil 
    guard let parsedDataArray = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [[String: AnyObject]] else { return } 

    //Here you can enumerate through your array to get each dictionary 
    for parsedDict in parsedDataArray { 
     //This gives the value of latitude 
     if let latitude = parsedDict["latitude"] { 
      print(latitude) 
     } 
     //And this is for "longitude" 
     if let longitude = parsedDict["longitude"] { 
      print(longitude) 
     } 
    } 
} 
1

Von Ihrer JSON-Antwort, dass Sie in Frage hinzugefügt haben, wenn dies die einzige Antwort ist, dass man [[String: String]] statt [[String: AnyObject]] verwenden muß, weil AnyObject verwenden müssen Sie zuerst konvertieren zu String dann doppelt, so ist es Teig, wenn Sie [[String: String]] verwenden. Jetzt haben Sie Array von Wörterbuch, so erhalten Sie alle Koordinaten auf diese Weise.

let parsedData = try? JSONSerialization.jsonObject(with: data!, options: []) as! [[String:String]] 
for dic in parsedData { 
    if let lat = Double(dic["latitude"]), let long = Double(dic["longitude"]) { 
     print(lat) 
     print(long) 
    } 
} 
+0

YESS zu bekommen! Deine Lösung funktioniert, ich bin so dankbar! Kann jemand ihn bewerten, ich kann es nicht tun ... Aber wirklich danke Nirav D! – royvano

+0

Willkommen Kumpel :) –