如何防止JSONKit从ASP.NET JSON日期格式转义反斜杠?

时间:2011-04-30 20:50:38

标签: iphone asp.net objective-c json ios

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

该服务使用的日期格式涉及here,如下所示:

"\/Date(1198908717056)\/"

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

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

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

有没有人知道一种方法可以防止JSONKit在出现类似于ASP.NET JSON日期格式的正斜杠之后转义反斜杠?

1 个答案:

答案 0 :(得分: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。请随时将他推荐给这篇文章。