如何防止 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 日期格式转义反斜杠?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET如何防止SQL注入

asp.net如何防止xss(脚本注入啊)

asp.net 怎么防止SQL注入攻击啊???

如何从asp.net中的js函数调用c#函数?

防止 ASP.NET 中的 413 错误请求实体太大 [重复]

如何防止asp.net应用程序会话劫持?