Объект SwiftyJSON с параметром Alamofire post

#ios #json #swift #alamofire #swifty-json

#iOS #json #swift #alamofire #swifty-json

Вопрос:

ОК. Застрял на простой задаче, преобразовывая проект из AFNetworking swift 2 в Alamofire swift 3.

У меня есть один объект json (SwiftyJSON), и его нужно отправить в качестве основного параметра json.

Вот мой объект:

 {
  "enableSMS" : 1,
  "deviceAssociationID" : 12,
  "timeStamp" : "2016-10-07 23:35:32",
  "userDeviceAccessID" : 1,
  "valueBattery" : 25,
  "deviceDescription" : "<null>",
  "deviceID" : 1,
  "valueTemperature" : 46,
  "valueTRange1" : "0.000000",
  "deviceTypeId" : 1,
  "latitude" : "-23.504236000000000",
  "enableEmail" : 1,
  "valueTiers" : [
    {
      "userShareDeviceId" : 6,
      "sharedStatusId" : 1,
      "sharedStatus" : "INVITE_SENT",
      "destUserId" : 60,
      "personEmail" : "eu@you.com",
      "sharedDate" : "2016-08-17 20:57:06",
      "personName" : "Daniel",
      "personPhone" : " 55 11 9999999999",
      "acceptationDate" : null
    },
    {
      "userShareDeviceId" : 7,
      "sharedStatusId" : 1,
      "sharedStatus" : "INVITE_SENT",
      "destUserId" : 1,
      "personEmail" : "x@y.com",
      "sharedDate" : "2016-10-04 20:00:06",
      "personName" : "John",
      "personPhone" : "",
      "acceptationDate" : null
    }
  ],
  "enableTimeRange" : 1,
  "deviceVersion" : "0.1",
  "valueSMS" : [
    {
      "SMSId" : 1,
      "personName" : "Daniel",
      "personPhone" : " 55 11 999999999"
    }
  ],
  "deviceName" : "Vovózinhaaaa",
  "jsonAddress" : "{"place_id":"24020287","licence":"Data © OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright","osm_type":"node","osm_id":"2355070909","lat":"-23.5038297","lon":"-46.6285165","display_name":"Itaú Personalité, Avenida Brás Leme, Jardim São Bento, Casa Verde, SP, Microrregião de São Paulo, RMSP, Mesorregião Metropolitana de São Paulo, SP, Região Sudeste, 02022-010, Brasil","address":{"bank":"Itaú Personalité","road":"Avenida Brás Leme","neighbourhood":"Jardim São Bento","suburb":"Casa Verde","city_district":"Casa Verde","city":"SP","county":"Microrregião de São Paulo","state_district":"Mesorregião Metropolitana de São Paulo","state":"SP","postcode":"02022-010","country":"Brasil","country_code":"br"},"boundingbox":["-23.5039297","-23.5037297","-46.6286165","-46.6284165"]}",
  "deviceJSONWeather" : "{"coord":{"lon":-46.63,"lat":-23.47},"weather":[{"id":802,"main":"Clouds","description":"scattered clouds","icon":"03n"}],"base":"cmc stations","main":{"temp":299.26,"pressure":1023,"humidity":81,"temp_min":299.26,"temp_max":299.26},"wind":{"speed":3.08,"deg":70,"gust":3.08},"rain":{"3h":0.03},"clouds":{"all":36},"dt":1470863106,"sys":{"type":3,"id":135121,"message":0.0091,"country":"BR","sunrise":1470821690,"sunset":1470862123},"id":3467431,"name":"Cantareira","cod":200}",
  "acceleration" : "3.89743600",
  "temperature" : "27.00",
  "speed" : "9.000000",
  "valueEmails" : [
    {
      "emailId" : 1,
      "personName" : "John Doe",
      "personEmail" : "j@doe.com"
    },
    {
      "emailId" : 2,
      "personName" : "Daniel",
      "personEmail" : "eu@you.com"
    }
  ],
  "longitude" : "-46.628792000000000",
  "valueGeoFencing" : [
    {
      "geoFencingAnalyseSaturday" : 1,
      "geoFencingLongitude" : "-46.639857300000020",
      "geoFencingName" : "Geo 1",
      "geoFencingAddress" : "Tv. Heliodora, 14",
      "geoFencingLatitude" : "-23.503186700000000",
      "geoFencingTimeRange1" : "0.150000000",
      "geoFencingAnalyseSunday" : 0,
      "geoFencingTimeEnabled" : 0,
      "geoFencingAnalyseMonday" : 1,
      "geoFencingAnalyseTuesday" : 1,
      "geoFencingTypeId" : 1,
      "geoFencingTimeRange2" : "0.750000000",
      "geoFencingId" : 5,
      "geoFencingAnalyseFriday" : 1,
      "geoFencingRadius" : 744,
      "geoFencingAnalyseWednesday" : 0,
      "geoFencingTypeName" : "ENTER",
      "geoFencingAnalyseThursday" : 1
    }
  ],
  "enableImpact" : 1,
  "enableGeoFencing" : 1,
  "devicePicture" : "https://pic.com/devices/12.jpg",
  "userID" : 1,
  "enableAlerts" : 1,
  "useTypeDescription" : "SENIOR",
  "enableBattery" : 1,
  "valueSpeed" : 62,
  "batteryLevel" : 73,
  "valueTRange2" : "1.000000",
  "altitude" : "721.900024",
  "enableSpeed" : 1,
  "deviceTimeZoneName" : "(GMT -3:00) Eastern Brazil",
  "heading_to" : "116.839996",
  "enableTemperature" : 1,
  "enableTiers" : 1,
  "deviceStatus" : "ACTIVATED",
  "deviceSerialNumber" : "TRX00001",
  "alertsNonRead" : 69,
  "deviceUseTypeId" : 4,
  "deviceTimeZone" : "America/Sao_Paulo"
}
  

Пытаясь опубликовать его напрямую (приведение к типу параметра), мой API не распознает ни одного параметра.

Затем я преобразовал в словарь:

 do {
    let dic = try JSONSerialization.jsonObject(with: data!, options: .allowFragments)
    userDevices.updateUserDevices(settings: dic as! Parameters) { (response, error) in
        print(response)
        print(error)
    }
} catch {
    print("error")
}
  

Отладка сообщения Alamofire У меня есть эта сериализация:

 "{"enableSMS":1,"deviceAssociationID":12,"deviceTimeZone":"America/Sao_Paulo","userDeviceAccessID":1,"valueBattery":25,"deviceDescription":"<null>","deviceID":1,"valueTemperature":46,"valueTRange1":"0.000000","deviceTypeId":1,"latitude":"-23.504236000000000","enableEmail":1,"valueTiers":[{"userShareDeviceId":6,"sharedStatusId":1,"sharedStatus":"INVITE_SENT","destUserId":60,"personEmail":"eu@daniellombardi.com.br","sharedDate":"2016-08-17 20:57:06","personName":"Daniel Lombardi","personPhone":" 55 11 981378213","acceptationDate":null},{"userShareDeviceId":7,"sharedStatusId":1,"sharedStatus":"INVITE_SENT","destUserId":1,"personEmail":"giulio@loffreda.com.br","sharedDate":"2016-10-04 20:00:06","personName":"Giulio","personPhone":"","acceptationDate":null}],"enableTimeRange":1,"deviceVersion":"0.1","valueSMS":[{"SMSId":1,"personName":"Daniel Lombardi","personPhone":" 55 11 981378213"}],"deviceName":"Vovózinhaaaa","userID":1,"deviceJSONWeather":"{\"coord\":{\"lon\":-46.63,\"lat\":-23.47},\"weather\":[{\"id\":802,\"main\":\"Clouds\",\"description\":\"scattered clouds\",\"icon\":\"03n\"}],\"base\":\"cmc stations\",\"main\":{\"temp\":299.26,\"pressure\":1023,\"humidity\":81,\"temp_min\":299.26,\"temp_max\":299.26},\"wind\":{\"speed\":3.08,\"deg\":70,\"gust\":3.08},\"rain\":{\"3h\":0.03},\"clouds\":{\"all\":36},\"dt\":1470863106,\"sys\":{\"type\":3,\"id\":135121,\"message\":0.0091,\"country\":\"BR\",\"sunrise\":1470821690,\"sunset\":1470862123},\"id\":3467431,\"name\":\"Cantareira\",\"cod\":200}","jsonAddress":"{\"place_id\":\"24020287\",\"licence\":\"Data © OpenStreetMap contributors, ODbL 1.0. http:\/\/www.openstreetmap.org\/copyright\",\"osm_type\":\"node\",\"osm_id\":\"2355070909\",\"lat\":\"-23.5038297\",\"lon\":\"-46.6285165\",\"display_name\":\"Itaú Personalité, Avenida Brás Leme, Jardim São Bento, Casa Verde, SP, Microrregião de São Paulo, RMSP, Mesorregião Metropolitana de São Paulo, SP, Região Sudeste, 02022-010, Brasil\",\"address\":{\"bank\":\"Itaú Personalité\",\"road\":\"Avenida Brás Leme\",\"neighbourhood\":\"Jardim São Bento\",\"suburb\":\"Casa Verde\",\"city_district\":\"Casa Verde\",\"city\":\"SP\",\"county\":\"Microrregião de São Paulo\",\"state_district\":\"Mesorregião Metropolitana de São Paulo\",\"state\":\"SP\",\"postcode\":\"02022-010\",\"country\":\"Brasil\",\"country_code\":\"br\"},\"boundingbox\":[\"-23.5039297\",\"-23.5037297\",\"-46.6286165\",\"-46.6284165\"]}","temperature":"27.00","speed":"9.000000","valueEmails":[{"emailId":1,"personName":"Giulio Loffreda","personEmail":"giulio@loffreda.com.br"},{"emailId":2,"personName":"Daniel Lombardi","personEmail":"eu@daniellombardi.com.br"}],"longitude":"-46.628792000000000","valueGeoFencing":[{"geoFencingAnalyseThursday":1,"geoFencingLongitude":"-46.639857300000020","geoFencingName":"Geo 1","geoFencingAddress":"Tv. Heliodora, 14","geoFencingLatitude":"-23.503186700000000","geoFencingTimeRange1":"0.150000000","geoFencingAnalyseSunday":0,"geoFencingTimeEnabled":0,"geoFencingAnalyseMonday":1,"geoFencingAnalyseTuesday":1,"geoFencingTypeId":1,"geoFencingTimeRange2":"0.750000000","geoFencingId":5,"geoFencingAnalyseFriday":1,"geoFencingRadius":744,"geoFencingAnalyseSaturday":1,"geoFencingAnalyseWednesday":0,"geoFencingTypeName":"ENTER"}],"enableImpact":1,"enableGeoFencing":1,"devicePicture":"https://profiles.t-rex.io/devices/12.jpg","acceleration":"3.89743600","enableAlerts":1,"useTypeDescription":"SENIOR","enableBattery":1,"valueSpeed":62,"batteryLevel":73,"valueTRange2":"1.000000","altitude":"721.900024","enableSpeed":1,"deviceTimeZoneName":"(GMT -3:00) Eastern Brazil","heading_to":"116.839996","enableTemperature":1,"enableTiers":1,"deviceStatus":"ACTIVATED","deviceSerialNumber":"TRX00001","alertsNonRead":69,"deviceUseTypeId":4,"timeStamp":"2016-10-07 23:35:32"}" 
  

Который не соответствует json или api.

Это мой вызов:

 alamoFireManager?.request("(urlUserApi)", method: .post, parameters: settings, encoding: JSONEncoding.default, headers:["Authorization" : userData.apiKey])
            .debugLog()
            .responseJSON(completionHandler: { (response) in
                switch response.result {
                case .success:
                    let useType = JSON(response.result.value!)
                    if ((useType["error"].bool) == true) {
                        let error = NSError(domain: UserErrorDomain, code: -982, userInfo: [NSLocalizedDescriptionKey: translateStrings(useType["message"].string!)])
                        completion(nil, error)
                    } else {
                        completion(useType, nil)
                    }
                case .failure(let error):
                    completion(nil, error)
                }
            })
  

Пытаюсь изменить кодировку (перепробовал все из них) с помощью URLEncoding.по умолчанию у меня это:

 "acceleration=3.89743600amp;alertsNonRead=69amp;altitude=721.900024amp;batteryLevel=73amp;deviceAssociationID=12amp;deviceDescription=amp;deviceID=1amp;deviceJSONWeather={"coord":{"lon":-46.63,"lat":-23.47},"weather":[{"id":802,"main":"Clouds","description":"scattered clouds","icon":"03n"}],"base":"cmc stations","main":{"temp":299.26,"pressure":1023,"humidity":81,"temp_min":299.26,"temp_max":299.26},"wind":{"speed":3.08,"deg":70,"gust":3.08},"rain":{"3h":0.03},"clouds":{"all":36},"dt":1470863106,"sys":{"type":3,"id":135121,"message":0.0091,"country":"BR","sunrise":1470821690,"sunset":1470862123},"id":3467431,"name":"Cantareira","cod":200}amp;deviceName=Vovózinhaaaaamp;devicePicture=https://profiles.t-rex.io/devices/12.jpgamp;deviceSerialNumber=TRX00001amp;deviceStatus=ACTIVATEDamp;deviceTimeZone=America/Sao_Pauloamp;deviceTimeZoneName=(GMT -3:00) Eastern Brazilamp;deviceTypeId=1amp;deviceUseTypeId=4amp;deviceVersion=0.1amp;enableAlerts=1amp;enableBattery=1amp;enableEmail=1amp;enableGeoFencing=1amp;enableImpact=1amp;enableSMS=1amp;enableSpeed=1amp;enableTemperature=1amp;enableTiers=1amp;enableTimeRange=1amp;heading_to=116.839996amp;jsonAddress={"place_id":"24020287","licence":"Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright","osm_type":"node","osm_id":"2355070909","lat":"-23.5038297","lon":"-46.6285165","display_name":"Itaú Personalité, Avenida Brás Leme, Jardim São Bento, Casa Verde, SP, Microrregião de São Paulo, RMSP, Mesorregião Metropolitana de São Paulo, SP, Região Sudeste, 02022-010, Brasil","address":{"bank":"Itaú Personalité","road":"Avenida Brás Leme","neighbourhood":"Jardim São Bento","suburb":"Casa Verde","city_district":"Casa Verde","city":"SP","county":"Microrregião de São Paulo","state_district":"Mesorregião Metropolitana de São Paulo","state":"SP","postcode":"02022-010","country":"Brasil","country_code":"br"},"boundingbox":["-23.5039297","-23.5037297","-46.6286165","-46.6284165"]}amp;latitude=-23.504236000000000amp;longitude=-46.628792000000000amp;speed=9.000000amp;temperature=27.00amp;timeStamp=2016-10-07 23:35:32amp;useTypeDescription=SENIORamp;userDeviceAccessID=1amp;userID=1amp;valueBattery=25amp;valueEmails[][personName]=Giulio Loffredaamp;valueEmails[][personEmail]=giulio@loffreda.com.bramp;valueEmails[][emailId]=1amp;valueEmails[][personName]=Daniel Lombardiamp;valueEmails[][personEmail]=eu@daniellombardi.com.bramp;valueEmails[][emailId]=2amp;valueGeoFencing[][geoFencingTimeEnabled]=0amp;valueGeoFencing[][geoFencingAnalyseFriday]=1amp;valueGeoFencing[][geoFencingLongitude]=-46.639857300000020amp;valueGeoFencing[][geoFencingAddress]=Tv. Heliodora, 14amp;valueGeoFencing[][geoFencingId]=5amp;valueGeoFencing[][geoFencingAnalyseMonday]=1amp;valueGeoFencing[][geoFencingAnalyseWednesday]=0amp;valueGeoFencing[][geoFencingAnalyseThursday]=1amp;valueGeoFencing[][geoFencingLatitude]=-23.503186700000000amp;valueGeoFencing[][geoFencingAnalyseTuesday]=1amp;valueGeoFencing[][geoFencingTypeId]=1amp;valueGeoFencing[][geoFencingTypeName]=ENTERamp;valueGeoFencing[][geoFencingTimeRange1]=0.150000000amp;valueGeoFencing[][geoFencingName]=Geo 1amp;valueGeoFencing[][geoFencingTimeRange2]=0.750000000amp;valueGeoFencing[][geoFencingAnalyseSunday]=0amp;valueGeoFencing[][geoFencingRadius]=744amp;valueGeoFencing[][geoFencingAnalyseSaturday]=1amp;valueSMS[][personPhone]=+55 11 981378213amp;valueSMS[][personName]=Daniel Lombardiamp;valueSMS[][SMSId]=1amp;valueSpeed=62amp;valueTRange1=0.000000amp;valueTRange2=1.000000amp;valueTemperature=46amp;valueTiers[][userShareDeviceId]=6amp;valueTiers[][acceptationDate]=amp;valueTiers[][sharedStatusId]=1amp;valueTiers[][personPhone]=+55 11 981378213amp;valueTiers[][personEmail]=eu@daniellombardi.com.bramp;valueTiers[][sharedStatus]=INVITE_SENTamp;valueTiers[][sharedDate]=2016-08-17 20:57:06amp;valueTiers[][destUserId]=60amp;valueTiers[][personName]=Daniel Lombardiamp;valueTiers[][userShareDeviceId]=7amp;valueTiers[][acceptationDate]=amp;valueTiers[][sharedStatusId]=1amp;valueTiers[][personPhone]=amp;valueTiers[][personEmail]=giulio@loffreda.com.bramp;valueTiers[][sharedStatus]=INVITE_SENTamp;valueTiers[][sharedDate]=2016-10-04 20:00:06amp;valueTiers[][destUserId]=1amp;valueTiers[][personName]=Giulio" 
  

Который должен работать, но поскольку в этом объекте у меня есть подмассивы, мой серверный сервер не понимает как объект json.

Глупый трюк заключается в том, что он работал с AFNetworking.

Я что-то упускаю? конечно, но что? Уже прочитал все документы Alamofire и SwiftyJSON и перепробовал множество типов сериализации.

Редактировать:

РЕШЕНИЕ:

По крайней мере, в моем случае я изменил некоторые параметры, и это сработало как шарм:

 alamoFireManager?.request("(urlUserApi)", method: .post, parameters: settings.dictionaryValue, encoding: URLEncoding.default, headers:["Authorization" : userData.apiKey, "Content-Type" : "application/x-www-form-urlencoded"])
    .debugLog()
    .responseJSON(completionHandler: { (response) in
        switch response.result {
        case .success:
            let useType = JSON(response.result.value!)
            if ((useType["error"].bool) == true) {
                let error = NSError(domain: UserErrorDomain, code: -982, userInfo: [NSLocalizedDescriptionKey: translateStrings(useType["message"].string!)])
                completion(nil, error)
            } else {
                completion(useType, nil)
            }
        case .failure(let error):
            completion(nil, error)
        }
    })
  

это сделало свое дело:

 "Content-Type" : "application/x-www-form-urlencoded"
  

а также изменение типа параметра с параметра на JSON:

 settings: JSON
  

и реализовать его как словарь:

 settings.dictionaryValue
  

Надеюсь, это кому-нибудь поможет

Ответ @zombie работает нормально, просто не использовал его, чтобы не изменять мои стандарты реализации.

Ответ №1:

чтобы иметь возможность добавлять ваш json в виде строки в swift, я преобразовал его с помощью http://bernhardhaeussner.de/odd/json-escape /

итак, мой код выглядит так

 let values = "{n  "enableSMS" : 1,n  "deviceAssociationID" : 12,n  "timeStamp" : "2016-10-07 23:35:32",n  "userDeviceAccessID" : 1,n  "valueBattery" : 25,n  "deviceDescription" : "<null>",n  "deviceID" : 1,n  "valueTemperature" : 46,n  "valueTRange1" : "0.000000",n  "deviceTypeId" : 1,n  "latitude" : "-23.504236000000000",n  "enableEmail" : 1,n  "valueTiers" : [n    {n      "userShareDeviceId" : 6,n      "sharedStatusId" : 1,n      "sharedStatus" : "INVITE_SENT",n      "destUserId" : 60,n      "personEmail" : "eu@you.com",n      "sharedDate" : "2016-08-17 20:57:06",n      "personName" : "Daniel",n      "personPhone" : " 55 11 9999999999",n      "acceptationDate" : nulln    },n    {n      "userShareDeviceId" : 7,n      "sharedStatusId" : 1,n      "sharedStatus" : "INVITE_SENT",n      "destUserId" : 1,n      "personEmail" : "x@y.com",n      "sharedDate" : "2016-10-04 20:00:06",n      "personName" : "John",n      "personPhone" : "",n      "acceptationDate" : nulln    }n  ],n  "enableTimeRange" : 1,n  "deviceVersion" : "0.1",n  "valueSMS" : [n    {n      "SMSId" : 1,n      "personName" : "Daniel",n      "personPhone" : " 55 11 999999999"n    }n  ],n  "deviceName" : "Vovózinhaaaa",n  "jsonAddress" : "{\"place_id\":\"24020287\",\"licence\":\"Data © OpenStreetMap contributors, ODbL 1.0. http:\\\/\\\/www.openstreetmap.org\\\/copyright\",\"osm_type\":\"node\",\"osm_id\":\"2355070909\",\"lat\":\"-23.5038297\",\"lon\":\"-46.6285165\",\"display_name\":\"Itaú Personalité, Avenida Brás Leme, Jardim São Bento, Casa Verde, SP, Microrregião de São Paulo, RMSP, Mesorregião Metropolitana de São Paulo, SP, Região Sudeste, 02022-010, Brasil\",\"address\":{\"bank\":\"Itaú Personalité\",\"road\":\"Avenida Brás Leme\",\"neighbourhood\":\"Jardim São Bento\",\"suburb\":\"Casa Verde\",\"city_district\":\"Casa Verde\",\"city\":\"SP\",\"county\":\"Microrregião de São Paulo\",\"state_district\":\"Mesorregião Metropolitana de São Paulo\",\"state\":\"SP\",\"postcode\":\"02022-010\",\"country\":\"Brasil\",\"country_code\":\"br\"},\"boundingbox\":[\"-23.5039297\",\"-23.5037297\",\"-46.6286165\",\"-46.6284165\"]}",n  "deviceJSONWeather" : "{\"coord\":{\"lon\":-46.63,\"lat\":-23.47},\"weather\":[{\"id\":802,\"main\":\"Clouds\",\"description\":\"scattered clouds\",\"icon\":\"03n\"}],\"base\":\"cmc stations\",\"main\":{\"temp\":299.26,\"pressure\":1023,\"humidity\":81,\"temp_min\":299.26,\"temp_max\":299.26},\"wind\":{\"speed\":3.08,\"deg\":70,\"gust\":3.08},\"rain\":{\"3h\":0.03},\"clouds\":{\"all\":36},\"dt\":1470863106,\"sys\":{\"type\":3,\"id\":135121,\"message\":0.0091,\"country\":\"BR\",\"sunrise\":1470821690,\"sunset\":1470862123},\"id\":3467431,\"name\":\"Cantareira\",\"cod\":200}",n  "acceleration" : "3.89743600",n  "temperature" : "27.00",n  "speed" : "9.000000",n  "valueEmails" : [n    {n      "emailId" : 1,n      "personName" : "John Doe",n      "personEmail" : "j@doe.com"n    },n    {n      "emailId" : 2,n      "personName" : "Daniel",n      "personEmail" : "eu@you.com"n    }n  ],n  "longitude" : "-46.628792000000000",n  "valueGeoFencing" : [n    {n      "geoFencingAnalyseSaturday" : 1,n      "geoFencingLongitude" : "-46.639857300000020",n      "geoFencingName" : "Geo 1",n      "geoFencingAddress" : "Tv. Heliodora, 14",n      "geoFencingLatitude" : "-23.503186700000000",n      "geoFencingTimeRange1" : "0.150000000",n      "geoFencingAnalyseSunday" : 0,n      "geoFencingTimeEnabled" : 0,n      "geoFencingAnalyseMonday" : 1,n      "geoFencingAnalyseTuesday" : 1,n      "geoFencingTypeId" : 1,n      "geoFencingTimeRange2" : "0.750000000",n      "geoFencingId" : 5,n      "geoFencingAnalyseFriday" : 1,n      "geoFencingRadius" : 744,n      "geoFencingAnalyseWednesday" : 0,n      "geoFencingTypeName" : "ENTER",n      "geoFencingAnalyseThursday" : 1n    }n  ],n  "enableImpact" : 1,n  "enableGeoFencing" : 1,n  "devicePicture" : "https:\/\/pic.com\/devices\/12.jpg",n  "userID" : 1,n  "enableAlerts" : 1,n  "useTypeDescription" : "SENIOR",n  "enableBattery" : 1,n  "valueSpeed" : 62,n  "batteryLevel" : 73,n  "valueTRange2" : "1.000000",n  "altitude" : "721.900024",n  "enableSpeed" : 1,n  "deviceTimeZoneName" : "(GMT -3:00) Eastern Brazil",n  "heading_to" : "116.839996",n  "enableTemperature" : 1,n  "enableTiers" : 1,n  "deviceStatus" : "ACTIVATED",n  "deviceSerialNumber" : "TRX00001",n  "alertsNonRead" : 69,n  "deviceUseTypeId" : 4,n  "deviceTimeZone" : "America\/Sao_Paulo"n}"


      var data = values.data(using: String.Encoding.utf8, allowLossyConversion: false)

      do {
         var json = try JSONSerialization.jsonObject(with: data!, options: [])

         print(json)

         var request = URLRequest(url: url)
       request.httpMethod = "POST"
       request.setValue("application/json", forHTTPHeaderField: "Content-Type")

       request.httpBody = json

       Alamofire.request(request)
           .responseJSON { response in

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

                   if let data = response.data, let responseString = String(data: data, encoding: .utf8) {
                       print(responseString)
                   }
               case .success(let responseObject):
                   print(responseObject)
               }
       }
      }
      catch {
         print(error)
      }
  

Комментарии:

1. мне трудно понять, почему мой объект не является допустимым json. Использование jsonlint.com Я получаю действительный json. Попробуйте эту строку! JSONSerialization.data (с JSONObject: values) приводит к сбою моего приложения с недопустимым типом верхнего уровня при записи в формате JSON. Тестирование с помощью if JSONSerialization.isValidJSONObject(настройки) {} делает недействительным мой объект, который является точно таким же json в моем вопросе.

2. это сработало, и ваш код дал мне ценный совет … изменил мой метод и сработал как шарм. Отредактирует мой вопрос и предложит решение (как я реализовал), но ваш код работает нормально. Большое спасибо за вашу помощь