![](/img/trans.png)
[英]How to keep json-framwork from escaping the backslash when formatting date for WCF service in 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.