我正在使用JSONKit在ASP.NET RESTful服务之间编码/解码JSON。
该服务使用的日期格式涉及here,如下所示:
"\/Date(1198908717056)\/"
问题是,当JSONKit处理一个看起来像上面的字符串时,它会转义反斜杠,所以最终结果如下所示:
"\\/Date(1198908717056)\\/"
JSON规范说你可以选择转义正斜杠(/),这样JSONKit应该按原样解释“\ /”,而不是转义反斜杠。
有没有人知道一种方法可以防止JSONKit在出现类似于ASP.NET JSON日期格式的正斜杠之后转义反斜杠?
答案 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。请随时将他推荐给这篇文章。