簡體   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