Редактировать: Забудьте предыдущий ответ. Как упоминал Джон, это, вероятно, неправильно и имеет побочные эффекты. от 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. Не стесняйтесь отсылать его к этому сообщению.