编辑:忘记之前的答案。正如约翰所说,这可能是不正确的并且有副作用。 John 的 committed a change 实现了一个名为 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)\\/"
也就是说,我推荐你file a bug report with JSONKit。 John 无疑是解决这个问题的最佳人选,而 JSONKit 对我来说太过优化了,我对这个补丁没有信心;我对 JSONKit 一点也不熟悉。请随时向他推荐这篇文章。