Проблема с '/' при передаче параметра в API
У меня есть следующий код:-
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
NSData *data = [surveyAnswerForCurrentSurvey dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *answerJson = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSMutableDictionary *answer = [answerJson mutableCopy];
if([answer valueForKey:question.name] != nil){
[answer setObject:textField.text forKey:question.name];
}
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[answer copy] options:0 error:nil];
NSLog(@"ns data is %@",jsonData);
NSString *json = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"json string:%@", json);
NSDictionary *answersDict = @{@"answers_json":json};
NSData *answersAsData = [NSJSONSerialization dataWithJSONObject: answersDict options:0 error:nil];
NSString *answersJSONStringify = [[NSString alloc] initWithData: answersAsData encoding:NSUTF8StringEncoding];
parameters = @{@"survey_answer":answersJSONStringify};
[self submitSurveyAnswer];
В результате получается три символа '/', что делает параметр для передачи в API в неправильном формате.
Параметр:-
{ "survey_answer" = "{\"answers_json\":\"{\\\"7d2c591c-9056-405c-9509-03266842b7e5\\\":[\\\"1\\\"],\\\"4090442c-90ce-42c2-aae8-7c812b7c0f04\\\":\\\"test from postman\\\",\\\"54bdcf13-e500-418a-8bab-d0639e7e1e28\\\":\\\"2\\\",\\\"63bb0722-7099-4820-a400-36b8938c6ae8\\\":\\\"hello\\\",\\\"f884a7d1-f9d9-4563-bb6e-94538664f3bd\\\":\\\"test from cms and iphone\\\",\\\"ed3acc20-4ae4-493e-ac55-4d2d0f282886\\\":\\\"1\\\"}\"}"; }
1 ответ
Решение
Эта линия
NSDictionary *answersDict = @{@"answers_json":json};
Создает объект JSON с одним ключом, значение которого является строковым результатом сериализации вашего исходного объекта JSON. Все "
в строке нужно экранировать \
так вот что он делает, т.е.
{ "answer" : "{ "foo" : "bar" }" }
Недопустимо из-за встроенных кавычек в строке. Так что это делает это:
{ "answer" : "{ \"foo\" : \"bar\" }" }
Затем вы получаете умножение обратной косой черты, когда вы печатаете полученную строку, потому что обратную косую черту нужно экранировать.
Чтобы решить проблему, используйте объект JSON, а не его сериализацию. строка выше становится:
NSDictionary *answersDict = @{@"answers_json": [answer copy]};