如何发送json作为参数iOS swift?

时间:2017-08-09 03:36:02

标签: ios swift alamofire

我想将以下对象作为body参数发送。但序列化失败了:

{  
   "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}gi@y{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',原因:' *** + [NSJSONSerialization   dataWithJSONObject:options:error:]:JSON中的顶级类型无效   写'

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?

4 个答案:

答案 0 :(得分:1)

使用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)
}

答案 1 :(得分: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)")
        }

希望这可以帮助你。

答案 2 :(得分:0)

创建JSON参数以将其作为帖子正文发送:

功能:

    //MARK:- Create JSON String
        func createJSONParameterString(postBody:AnyObject) -> String {

            if let objectData = try? JSONSerialization.data(withJSONObject: postBody, options: JSONSerialization.WritingOptions(rawValue: 0)) {
                let objectString = String(data: objectData, encoding: .utf8)
                return objectString ?? ""
            }
            return ""
        }

用法:

    var postBody = [AnyHashable:Any]()
    postBody["device_id"] = "device_ID"
    let parameters = createJSONParameterString(postBody: postBody as AnyObject)
    print(parameters)

答案 3 :(得分:-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" : " "
  ]
]