2017-07-03 133 views
-6

我是Swift的新手,我通過PHP腳本以JSON格式從mysql獲取響應。但我的JSON是正確的格式:JSON響應格式不正確(Swift)

["Result": <__NSArrayI 0x60000005bc60>(
<__NSArray0 0x608000000610>(

) 
, 

{ 
    name = "abc" ; 
    address = "abc address" 

}, 
{ 
    name = "xyz" ; 
    address = "xyz address" 

} 
) 
] 

我的序列化代碼是:

let url = URL(string: "my url") 

    var request = URLRequest(url: url!) 
    request.httpMethod = "POST" 
    let body = "Id=\(Id)" 
    request.httpBody = body.data(using: .utf8) 
    // request.addValue("application/json", forHTTPHeaderField: "Content-type") 

    URLSession.shared.dataTask(with: request) { data, response, error in 

     if error == nil { 

      DispatchQueue.main.async(execute: { 

       do { 
        if let json = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? Dictionary<String,Any>{ 

         print(json) 

我要去哪裏錯了?

郵差輸出

{ 
"Result": [ 
    { 
     name = "abc" ; 
     address = "abc address" 
    }, 
    { 
     name = "xyz" ; 
     address = "xyz address" 
    } 

] 

}

+0

問題是你是鑄造數組作爲'字典'?嘗試將其改爲'as? [任何]' – Tj3n

+0

你可以請分享請求鏈接和參數與我?所以測試會更容易。 @ swiftuser123 – emraz

+1

@ Tj3n我確實改爲'as? [任何]'仍然是相同的錯誤格式。 – swiftuser123

回答

0

試一次。

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

夫特3.0 嘗試此代碼..

//聲明參數作爲字典

let parameters = ["Id": Id"] as Dictionary<String, String> 

//url 
let url = URL(string: "http://test.com/api")! 

//session object 
let session = URLSession.shared 

//URLRequest object using the url object 
var request = URLRequest(url: url) 
request.httpMethod = "POST" 

do { 
    request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted) 

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

request.addValue("application/json", forHTTPHeaderField: "Content-Type") 
request.addValue("application/json", forHTTPHeaderField: "Accept") 

let task = session.dataTask(with: request as URLRequest, completionHandler: { data, response, error in 

    guard error == nil else { 
     return 
    } 

    guard let data = data else { 
     return 
    } 

    do { 
     //json object from data 
     if let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] { 
      print(json) 
      // handle json... 
     } 

    } catch let error { 
     print(error.localizedDescription) 
    } 
}) 
task.resume() 

Alamofire

使用Alamofire嘗試此代碼..

let parameters = [ 
    "name": "user1"] 

let url = "https://myurl.com/api" 
Alamofire.request(url, method:.post, parameters:parameters,encoding: JSONEncoding.default).responseJSON { response in 
      switch response.result { 
      case .success: 
       print(response) 
      case .failure(let error): 
       failure(0,"Error") 
      } 
     } 
+0

它發送空的json。 [ 「結果」:<__ NSArrayM 0x600000253dd0>( <__ NSArrayM 0x600000253da0>( ) ) ] – swiftuser123

+0

我認爲你是從服務器獲得響應不是很好的格式,如果可能的份額實際的鏈接和param我。或者您可以使用POSTMAN進行測試,以便您可以輕鬆檢查POST鏈接的實際響應。 – emraz

+0

好的我會用POSTMAN嘗試 – swiftuser123

0

請確保您得到的響應爲json。有時會得到字符串作爲迴應。如果你得到字符串,然後將該json字符串轉換爲json對象。 檢查它是一個有效的JSON對象

let valid = JSONSerialization.isValidJSONObject(jsonOBJ) // jsonOBJ is the response from server 

print(valid) // if true then it is a valid json object