繁体   English   中英

如何防止 JSONKit 来自 escaping 反斜杠来自 ASP.NET JSON 日期格式?

[英]How to prevent JSONKit from escaping backslash from ASP.NET JSON date format?

我正在使用JSONKit在 ASP.NET RESTful 服务之间对 JSON 进行编码/解码。

该服务使用的日期格式在此处讨论,如下所示:

"\/Date(1198908717056)\/"

问题是当 JSONKit 处理一个看起来像上面的字符串时,它会转义反斜杠,所以最终结果看起来像这样:

"\\/Date(1198908717056)\\/"

JSON 规范说您可以选择转义正斜杠 (/),因此 JSONKit 应该按原样解释“\/”而不是转义反斜杠。

有谁知道一种方法来防止 JSONKit 从 escaping 反斜杠后跟一个正斜杠,就像上面的 ASP.NET JSON 日期格式的情况一样?

编辑:忘记以前的答案。 正如约翰所提到的,它可能是不正确的并且有副作用。 John提交了一个更改,该更改实现了一个名为JKSerializeOptionEscapeForwardSlashes的选项,它应该可以解决您的问题。


尽管 JSONKit 中的解析器似乎可以处理\/ ,但生成器似乎没有。 jk_encode_add_atom_to_buffer()

 if(JK_EXPECT_F(utf8String[utf8Idx] >= 0x80U)) { encodeState->atIndex = startingAtIndex; goto slowUTF8Path; }

这是一个非 ASCII 字符,从 go 到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 提交错误报告 John 无疑是解决这个问题的最佳人选,而 JSONKit 对我来说太过优化了,我对这个补丁没有信心; 我根本不熟悉 JSONKit。 随时向他推荐这篇文章。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM