我正在使用 JSONKit 在 ASP.NET RESTful 服务之间编码/解码 JSON。
服务使用的日期格式是关于 here 的,看起来像:
"\/Date(1198908717056)\/"
问题在于,当 JSONKit 处理看起来像上面的字符串时,它会转义反斜杠,因此最终结果如下所示:
"\\/Date(1198908717056)\\/"
JSON 规范说你可以选择对正斜杠 (/) 进行转义,因此 JSONKit 应该按原样解释 "\/" 而不是转义反斜杠。
有没有人知道一种防止 JSONKit 在后跟正斜杠时转义反斜杠的方法,就像上面针对 ASP.NET JSON 日期格式的情况一样?
最佳答案
编辑: 忘记上一个答案。正如约翰提到的,这可能是不正确的并且有副作用。 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。随意将他推荐给这篇文章。
关于iphone - 如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5844525/