#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. это сработало, и ваш код дал мне ценный совет … изменил мой метод и сработал как шарм. Отредактирует мой вопрос и предложит решение (как я реализовал), но ваш код работает нормально. Большое спасибо за вашу помощь