Как предотвратить экранирование JSONKit от обратной косой черты из формата даты JSON ASP.NET? - PullRequest
4 голосов
/ 01 мая 2011

Я использую JSONKit для кодирования / декодирования JSON между службой ASP.NET RESTful.

Формат даты, используемый сервисом, о котором говорится здесь и выглядит следующим образом:

"\/Date(1198908717056)\/"

Проблема в том, что когда JSONKit обрабатывает строку, похожую на приведенную выше, она избегает обратной косой черты, поэтому конечный результат выглядит следующим образом:

"\\/Date(1198908717056)\\/"

Спецификация JSON говорит, что вы можете при желании избежать косой черты (/), поэтому JSONKit должен интерпретировать "\ /" как есть и не избегать обратной косой черты.

Кто-нибудь знает способ предотвратить экранирование обратной косой черты JSONKit, если после нее идет прямая косая черта, как в случае выше для форматов дат ASP.NET JSON?

1 Ответ

1 голос
/ 01 мая 2011

Редактировать: Забудьте предыдущий ответ. Как упоминал Джон, это, вероятно, неправильно и имеет побочные эффекты. от John внес изменение , в котором реализована опция JKSerializeOptionEscapeForwardSlashes, которая должна решить вашу проблему.

<Ч />

Несмотря на то, что анализатор в JSONKit, кажется, обрабатывает \/, похоже, что генератор этого не делает. В jk_encode_add_atom_to_buffer():

if(JK_EXPECT_F(utf8String[utf8Idx] >= 0x80U)) { encodeState->atIndex = startingAtIndex; goto slowUTF8Path; }

Это не-ASCII символ, перейдите к slowUTF8Path.

if(JK_EXPECT_F(utf8String[utf8Idx] <  0x20U))

Это управляющий символ (например, \n или \t), избегайте его.

if(JK_EXPECT_F(utf8String[utf8Idx] == '\"') || JK_EXPECT_F(utf8String[utf8Idx] == '\\')) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\'; }

Это двойная кавычка или обратный слеш, избегайте его - и здесь кроется ошибка, поскольку он не учитывает \/.

Я исправил JSONKit.m, чтобы он делал следующее:

if(JK_EXPECT_F(utf8String[utf8Idx]) == '\\' && JK_EXPECT_F(utf8String[utf8Idx+1]) == '/') {
    encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\';
    encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '/';
    utf8Idx++;
}
else if(JK_EXPECT_F(utf8String[utf8Idx] == '\"') || JK_EXPECT_F(utf8String[utf8Idx] == '\\')) { encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = '\\'; }
else encodeState->stringBuffer.bytes.ptr[encodeState->atIndex++] = utf8String[utf8Idx];

и моя тестовая программа правильно генерирует фрагмент JSON для вашей строки:

NSString *test = @"\\/Date(1198908717056)\\/";
NSLog(@"%@", [test JSONString]);

выходы:

"\/Date(1198908717056)\/"

Без моего патча программа выводит:

"\\/Date(1198908717056)\\/"

Тем не менее, я рекомендую подать отчет об ошибке с помощью JSONKit . Джон, безусловно, лучший человек, чтобы исправить это, и JSONKit слишком оптимизирован, чтобы я мог быть уверен в этом патче; Я совсем не знаком с JSONKit. Не стесняйтесь отсылать его к этому сообщению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...