如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?
Posted
技术标签:
【中文标题】如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?【英文标题】:How to prevent JSONKit from escaping backslash from ASP.NET JSON date format? 【发布时间】:2011-04-30 20:50:38 【问题描述】:我正在使用JSONKit 在 ASP.NET RESTful 服务之间编码/解码 JSON。
服务使用的日期格式是here,看起来像:
"\/Date(1198908717056)\/"
问题在于,当 JSONKit 处理一个看起来像上面的字符串时,它会转义反斜杠,因此最终结果如下所示:
"\\/Date(1198908717056)\\/"
JSON 规范说您可以选择转义正斜杠 (/),因此 JSONKit 应该按原样解释 "\/" 而不是转义反斜杠。
有没有人知道一种方法可以防止 JSONKit 在反斜杠后面跟着一个正斜杠时转义,就像上面 ASP.NET JSON 日期格式的情况一样?
【问题讨论】:
我刚刚阅读了您的错误报告。我同意 John 的论点,并且我理解他不愿意在 JSON 规范不需要他的情况下在他的高性能解析器中再添加一个if
。
【参考方案1】:
编辑:忘记之前的答案。正如约翰所说,这可能是不正确的并且有副作用。 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 一点也不熟悉。请随时向他推荐这篇文章。
【讨论】:
以上是关于如何防止 JSONKit 从 ASP.NET JSON 日期格式转义反斜杠?的主要内容,如果未能解决你的问题,请参考以下文章