Объект JSOn не десериализуется правильно в wcf webservice side

Я работаю над проектом iOS и отправляю строку Json для поддержки через wcf webservice. Он успешно работает для многих пользователей, но для некоторых бэкэндов пользователей получается неполная строка json.

Код для генерации строки Json

NSData *data = [NSJSONSerialization dataWithJSONObject:EmployeeDetails options:0 error:nil];
    NSString *JsonString = [[NSString alloc] initWithData:data
                                                 encoding:NSUTF8StringEncoding];

И прикрепление строки json с запросом ниже кода

[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];

EmployeeDetails - это NSMutableDictionary со сведениями о сотрудниках.

И

Вот успешная строка Json, десериализованная из BackEnd

{"FirstName":"Donald","LastCBPaymentType":6,"AcceptEmail":true,"CellPhone":"321-300-6874","Position":"3","CarrierNum":"4","EmpNum":"96874"}

И строка незавершенного Json

{"FirstName":"roset","LastCBPaymentType":6,"AcceptEmail":true,"CellPhone":"321-300-6874","Position":"3","CarrierNum":"4","EmpNum":"98799

Неполная строка json, возникающая в бэкэнд для некоторого пользователя.

Кто-нибудь может помочь решить эту проблему?

Ответы

Ответ 1

Хорошо, я бы сказал, TomSwift на правильном пути... Очевидно, что сломанный JSON просто отсутствует"} с конца строки. Это действительно похоже на то, что дезинфицируется регулярным выражением... Вы действительно должны найти источник проблемы; Но для быстрого и грязного исправления, пока вы это понимаете, вы можете просто запустить собственное регулярное выражение на JSON, которое вы получите, и если оно не закончится с "}, просто добавьте его... Сначала сделайте что-нибудь вроде: '/" [0-9] + $/'(чтобы проверить, есть ли открытая числовая строка в конце, если есть, вы закрываете его, добавляя"), затем проверьте, является ли'/} $/'(if) последним char, если это не так: добавьте его).

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

PS. Если кто-то решит использовать исправление, как указано выше, пожалуйста, пожалуйста, ради любви ко всему, что вы храните святым, оставьте комментарий в коде, объясняющем , почему вы это сделали (в отличие от того, чтобы сообщить нам , что вы сделали...).

Ответ 2

У меня была аналогичная проблема в PHP/CodeIgniter в последнее время, и проблема заключалась в том, что JSON подвергался "дезинфекции" через некоторые чрезмерно амбициозные регулярные выражения, прежде чем он попал к моему обработчику. Возможно, есть какая-то подобная дезинфекция, которая происходит в WCF?

Вещи, которые я хотел бы попробовать:

  • Используя Charles Proxy, чтобы подтвердить, что запрос (POST?) фактически отправляет полное тело, как вы ожидаете.

  • Попробуйте приложение Content-Type/json вместо этого.