2017-08-09 97 views
0

我想发送下面的对象作为身体参数。但是,系列化失败:如何将json作为参数iOS swift发送?

{ 
    "StartAddress":"Colombo", 
    "EndAddress":"Kandy", 
    "DepartureAddress":"Kollupitiya, Colombo", 
    "ArrivalAddress":"Peradeniya, Kandy", 
    "CreatedDate":"2017-07-30", 
    "Date":"2017-07-30", 
    "Time":"2017-07-30", 
    "IsLadiesOnly":true, 
    "IpAddress":"fe80::8638:38ff:fec8:ea50%wlan0", 
    "Country":"Srilanka", 
    "VehicleId":"1129", 
    "StartLocation":[ 
     6.9270974, 
     79.8607731 
    ], 
    "EndLocation":[ 
     7.2916216, 
     80.6341326 
    ], 
    "Points":"k}[email protected]{lf", 
    "Route":{ 
     "Bounds":{ 
     "NorthEast":[ 
      7.2916216, 
      80.6341326 
     ], 
     "SouthWest":[ 
      6.9270974, 
      79.8607731 
     ] 
     }, 
     "Legs":[ 
     { 
      "LegId":1, 
      "Distance":14904, 
      "Duration":1941, 
      "StartAddress":"Colombo", 
      "EndAddress":"Kadawatha", 
      "StartLocation":[ 
       6.9270974, 
       79.8612478 
      ], 
      "EndLocation":[ 
       7.0011125, 
       79.95000750000001 
      ], 
      "Ancestors":[ 

      ], 
      "Price":745 
     }, 
     { 
      "LegId":2, 
      "Distance":63040, 
      "Duration":6209, 
      "StartAddress":"Kadawatha", 
      "EndAddress":"Kegalle", 
      "StartLocation":[ 
       7.0011125, 
       79.95000750000001 
      ], 
      "EndLocation":[ 
       7.251436200000001, 
       80.3466076 
      ], 
      "Ancestors":[ 
       "Colombo" 
      ], 
      "Price":3152 
     }, 
     { 
      "LegId":3, 
      "Distance":38990, 
      "Duration":4430, 
      "StartAddress":"Kegalle", 
      "EndAddress":"Kandy", 
      "StartLocation":[ 
       7.251436200000001, 
       80.3466076 
      ], 
      "EndLocation":[ 
       7.2901864, 
       80.6338425 
      ], 
      "Ancestors":[ 
       "Colombo", 
       "Kadawatha" 
      ], 
      "Price":1950 
     } 
     ] 
    }, 
    "TotalPrice":"5847.0", 
    "SeatCount":1, 
    "Detour":1, 
    "Luggage":2, 
    "DetoursDescription":"10 Minutes", 
    "LuggageDescription":"Small Luggage", 
    "Notes":"new ride" 
} 

当我尝试之前,序列化把它给出了一个错误:

'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'

func synchronusPostRequstWithHeadersJson(apiMethod:String, params:JSON, headers:[ String: String]) -> ResultModel { 

    let resultModel = ResultModel() 

    //create the url with URL 
    let url = URL(string: BASE_URL + apiMethod)! 

    let session = URLSession.shared 
    //// **** HERE IT FAILING *****//// 
    let jsonData = try? JSONSerialization.data(withJSONObject: params) 

    var request = URLRequest(url: url) 

    request.httpMethod = "POST" 

    request.httpBody = jsonData 

    for item in headers { 
     request.addValue(item.value, forHTTPHeaderField: item.key) 
    } 

    let semaphore = DispatchSemaphore(value: 0) 

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


     if(error != nil){ 
      resultModel.ErrorType = .NO_INT 
      resultModel.JsonReslut = JSON.null 

     }else{ 

      if let resp = response as? HTTPURLResponse{ 
       if(resp.statusCode == 200){ 
        if let jsonResult = JSON(data) as? JSON { 

         resultModel.ErrorType = .NO_ERROR 
         resultModel.JsonReslut = jsonResult 
        } 
       }else{ 
        if let jsonResult = JSON(data) as? JSON { 

         resultModel.ErrorType = .SEREVR_ERROR 
         resultModel.JsonReslut = jsonResult 
        }else{ 
         resultModel.ErrorType = .SEREVR_ERROR 
         resultModel.JsonReslut = JSON.null 
        } 
       } 
      } 
     } 


     semaphore.signal() 
    }) 
    task.resume() 
    _ = semaphore.wait(timeout: DispatchTime.distantFuture) 
    return resultModel 
} 

我如何可以发送请求? alamofire可能吗?

+0

我已经发布的解决方案尝试,如果在jsonSerialization错误就是给你本地化的说明,而不是崩溃 –

回答

0

尝试使用

var request = URLRequest(url: url) 
    request.httpMethod = "POST" //set http method as POST 

    do { 
     request.httpBody = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) // pass dictionary to nsdata object and set it as request body 

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

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

使用Almofire就可以实现这个作为

let params: [String: Any] = [ 
"StartAddress":"Colombo", 
"EndAddress":"Kandy", 
"DepartureAddress":"Kollupitiya, Colombo", 
"StartLocation":[ 
    6.9270974, 
    79.8607731 
], 
"EndLocation":[ 
    7.2916216, 
    80.6341326 
    ], 
] //Do check your dictionary it must be in correct format 


Alamofire.request("yourUrl", method: .post, parameters: params, encoding: JSONEncoding.default) 
.responseJSON { response in 
    print(response) 
} 
0

尝试使用:

 let session = Foundation.URLSession.shared 
     let url = URL(string: "Your server url") 
     var request = URLRequest(url : url!) 
     request.httpMethod = "POST" 
     let params :[String:Any] = ["name":"yuyutsu" as Any,"rollno":12 as Any] //Add your params 
     do { 

      let jsonData = try JSONSerialization.data(withJSONObject: params, options: .prettyPrinted) 

      request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") 
      request.httpBody = jsonData 

      session.dataTask(with: request, completionHandler: { data, response, error in 
       OperationQueue.main.addOperation { 

        guard error == nil && data != nil else {               // check for fundamental networking error       
         return 
        } 

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {   // check for http errors 
         print("statusCode should be 200, but is \(httpStatus.statusCode)") 
         //       print("response = \(response)") 

        } 

        let responseString = String(data: data!, encoding: String.Encoding.utf8) 
        print("responseString = \(responseString!)") 

        if let responsedata = responseString!.data(using: String.Encoding.utf8)! as? Data{ 

         do { 

          let jsonResult:NSDictionary = try JSONSerialization.jsonObject(with: responsedata, options: []) as! NSDictionary 
          print("Get The Result \(jsonResult)") 
          if error != nil { 
           //         print("error=\(error)") 
          } 


          if let str = jsonResult["success"] as? NSNull { 
           print("error=\(str)") 

          } 
          else { 
           let responseString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue) 
           print("Response string : \(responseString)") 

          } 



         } catch let error as NSError { 
          print(error.localizedDescription) 
         } 
        } 
       } 
      }) .resume() 
     }catch { 
      //    print("Error -> \(error)") 
     } 

希望这会帮助你。

-1

我已经解决了使用Alamofire和SwiftyJson类似的问题如下

让打电话给你的对象(数据)

let json = JSON(data) 

let Params :Dictionary = json.dictionaryObject! 

和Alamofire要求

Alamofire.request(url, method: .post, parameters: Params , encoding: JSONEncoding.prettyPrinted, headers: nil) 

     //.validate(statusCode: 200..<300) 
     .responseJSON { response in 

      switch response.result 
      { 
      case .failure(let error): 


      case .success(let value): 
      } 

它需要更换这个“ {}“与”[]“ 和alamofire和swift json处理该问题

例如:

[ 
    { 
    "firstName" : " " , 
    "lastName" : " " 
    }, 
    { 
    "firstName" : " " , 
    "lastName" : " " 
    } 
] 

改变它

[ 
    [ 
    "firstName" : " " , 
    "lastName" : " " 
    ], 
    [ 
    "firstName" : " " , 
    "lastName" : " " 
    ] 
]