Проблема с '/' при передаче параметра в 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-03266842b7‌​e5\\\":[\\\"1\\\"],\‌​\\"4090442c-90ce-42c‌​2-aae8-7c812b7c0f04\‌​\\":\\\"test from postman\\\",\\\"54bdcf13-e500-418a-8bab-d0639e7e1e28\\\":\\\‌​"2\\\",\\\"63bb0722-‌​7099-4820-a400-36b89‌​38c6ae8\\\":\\\"hell‌​o\\\",\\\"f884a7d1-f‌​9d9-4563-bb6e-945386‌​64f3bd\\\":\\\"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]};
Другие вопросы по тегам