안녕하세요.
스위프트 공부해가며 프로젝트 진행중이라 에로사항이 많네요. ㅜㅜ
서버 API로 보내야할 값이 Double이라서
딕셔너리 만들고 더블 값 채워서 보내기 직전 로그를 봤을때는 정확하게 6.0이 찍혔는데,,,
Alamofire를 통해서 서버에 보내면
6으로 찍혀서 타입오류가 나옵니다. -_-;;
Alamofire.request("URL", method: .post,
parameters: params, encoding: JSONEncoding.default)
.validate(statusCode: 200..<300)
.responseJSON {
위의 형식으로 보내고 있는데요.
왜이렇게 변환이 되는건지 알고 싶습니다. (_ _)
(스위프트, Alamofire 모두 버전 4대입니다)
감사합니다.
서버에서 요청 그대로 사용하지 않고 형변환을 알맞게 처리해야 하는 것 아닐까요?
콘솔에는 타입이 제대로 지정되었기 때문에 잘 나오는 듯 하고,
실제 JSON은... 타입이라는게 존재 하나요...?
저도 궁금하네요. 고수님들이 답변해주실듯!
분명히 보내기 직전 로그에서는 . 이하 숫자까지 잘 표기 되던데.. 보내는 파라미터는 딕셔너리로 만들어서 보냈습니다.
6.0이 iOS SDK에서는 Double로 타입지정이 되어 있지만 JSON으로 만들면서 정수가 되면 소수점 이하는 버리는게 아닐까 생각이 됩니다.
아니면 딕셔너리를 만들 때 타입을 Double이 아니라 String으로 (6.0을 텍스트화 해서) 넣어보세요.
저의 경우 6.0을 강제로 String으로 만들어서 파라미터에 포함시켜 요청 할 것 같고요.
자사 서버라면 서버 개발자에게 요청 파라미터 사용할 때 적절히 형변환해서 사용해 달라 요청할 것 같네요:)
6.0 -> 6 -> 6.0
6.1 -> 6.1 -> 6.1
var params: [String : Any] = [
"mbrUid": userid!,
"eatDate": getDateString(),
"mealType": getMealType(),
"foodList": Array<Any>()
]
var existItems = Array<Any>()
for (index, _) in 리스트 {
let food = self.result?.getFoodPositionAtIndex(index: index)
let selectedFood: Dictionary<String, Any> = [
"foodName": food!.foodName,
"unit": food!.nutrition!.unit,
"calories": Double(food!.nutrition!.calories),
"carbohydrate": Double(food!.nutrition!.carbonhydrate),
"cholesterol": Double(food!.nutrition!.cholesterol),
"fat": Double(food!.nutrition!.fat),
"protein": Double(food!.nutrition!.protein),
"sodium": Double(food!.nutrition!.sodium),
]
existItems.append(selectedFood as [String : Any])
}
params["foodList"] = existItems
이렇게 JSON 데이터를 만들어서 전송하고 있는데요. 혹시 파라미터가 문제일까요?
이 부분을
String(Double(food!.nutrition!.calories))
이렇게 한번 더 감싸서 보내보세요
Alamofire는 원인이 아닌 것 같습니다.
-추가-
food!.nutrition!.calories는 타입이 어떤건가요?
String으로 감싸서 보내도 똑같네용.. 왜 소수점 이하는 절삭하는지 원인을 모르니 너무 답답합니다.
Double이던 Float 이던 변수에 0.0을 셋팅해도 자체적으로 0으로 변환해버리는게 문제 같네요.
".2f"로 스트링 만들어서 재변환 해도 결국 0이 되어버리는..
기본적으로 시스템이 제공하는 JSONSerialization.data(withJSONObject:options:) 이 소수점 아래를 잘라버리는 듯 하던데요.
Alamofire도 이걸 쓰고 있는데, JSON 인코더를 직접 만들어야 해결가능하지 않을지..
String으로 감싸도 소수점 아래가 잘리는 건 의외인데, String으로 감싸면, JSON에서의 타입이 number -> string이 되는 거라, 서버 쪽도 변경이 필요하지 않을까요?
전송되는 네트패킷을 점검해보거나, 간단하게 서버API 테스트용으로 만들어서 그쪽으로 제대로 보내지는지도 확인해보셔요.