2017-07-03 170 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