2016-04-08 12 views
1

Ich sende gerade eine Anfrage an Emotion API von Microsoft, die Anfrage ist erfolgreich, aber ich erhalte eine ungültige JSON (JSON kann nicht konvertiert werden mit NSJSONSerialization.JSONObjectWithData as! [String: String] oder mit SwiftyJSON sondern kann als NSArray umgewandelt werden (ich bin in der Lage zu verwenden, die NSArray). (Alle anderen Optionen zurück nil)Ungültige JSON-Rückgabe: Kann nicht als [String: String] analysiert werden, funktioniert aber als NSArray

Anfrage

let params = [ "url": "http://reneemullingslewis.com/wp-content/uploads/2014/08/woman-smiling.png" ] 
    let body = try? NSJSONSerialization.dataWithJSONObject(params, options: []) 
    let url = NSURL(string: "https://api.projectoxford.ai/emotion/v1.0/recognize")! 
    let request = NSMutableURLRequest(URL: url) 
    request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") 
    request.setValue("XXXXXXXXXXXXXXXXXXXXXX", forHTTPHeaderField: "Ocp-Apim-Subscription-Key") 
    request.HTTPBody = body 
    request.HTTPMethod = "POST" 

    let task = NSURLSession.sharedSession().dataTaskWithRequest(request){ data, response, error in 
     if error != nil{ 
      print("Error -> \(error)") 
      return 
     } 
     do { 
      let result = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? NSArray 
      let dResult = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as? [String:String] 
      let json = JSON(data!) 
      print(result) 
      print(result?[0]["scores"]??["anger"]) //Is works 
      print(dResult) //Returns nil 
      print(json) //Returns 'unknown' 

     } catch { 
      print(error) 
     } 
    } 

    task.resume() 

Excpected JSON (Ergebnisse von API Testkonsole)

[ 
    { 
    "faceRectangle": { 
     "height": 208, 
     "left": 172, 
     "top": 128, 
     "width": 208 
    }, 
    "scores": { 
     "anger": 2.46091458E-05, 
     "contempt": 0.297730684, 
     "disgust": 9.475541E-05, 
     "fear": 1.13360545E-06, 
     "happiness": 0.564267159, 
     "neutral": 0.131727561, 
     "sadness": 1.14351078E-05, 
     "surprise": 0.0061426633 
    } 
    } 
] 

NSArray Ergebnisse

(
     { 
     faceRectangle =   { 
      height = 147; 
      left = 130; 
      top = 177; 
      width = 147; 
     }; 
     scores =   { 
      anger = "0.000382305647"; 
      contempt = "0.304994762"; 
      disgust = "0.006239909"; 
      fear = "0.000005770166"; 
      happiness = "0.6252902"; 
      neutral = "0.06043929"; 
      sadness = "0.002567473"; 
      surprise = "0.00008030776"; 
     }; 
    }, 
     { 
     faceRectangle =   { 
      height = 48; 
      left = 732; 
      top = 35; 
      width = 48; 
     }; 
     scores =   { 
      anger = "0.00000843479847"; 
      contempt = "0.00121067557"; 
      disgust = "0.00008578587"; 
      fear = "0.0000008104981"; 
      happiness = "0.9274825"; 
      neutral = "0.07090671"; 
      sadness = "0.000124009457"; 
      surprise = "0.000181075331"; 
     }; 
    } 
) 
+1

Die Antwort ist ein JSON-Array, so dass alles wie erwartet funktioniert! –

+0

@ AndréSlotta danke! Ich konnte es mit 'let json1 = JSON (Ergebnis! [0])' – kye

+0

toll :) mach dir keine Sorgen ... –

Antwort

3

[String:String] (aka Dictionary<String,String>) ein Wörterbuch ist, kein Feld, das gemeinsame Swift-Array-Typ für JSON ist [[String:AnyObject]] (auch bekannt als Array<Dictionary<String,AnyObject>>)