[英]Json.Net unexpected characters (“\”) when serializing my entities
我正在使用優秀的 Json.Net 庫來序列化由實體框架生成的實體。 我使用以下代碼來做到這一點:
using (MyVoucherEntities context = new MyVoucherEntities())
{
List<MyObject> list = context.MyObjects.ToList();
string json = JsonConvert.SerializeObject(list);
}
一切順利我的意思是,對象被正確序列化,除了一個想法:它添加了轉義字符“\\”,這讓我在客戶端反序列化時做噩夢。
[
{
\"$id\": \"1\",
\"CreationDate\": \"\\\/Date(1293186324257+0000)\\\/\",
\"ImageUrl\": \"http:\/\/www.google.com\",
\"Title\": \"Here is a title\"
} ]
有人知道為什么以及如何擺脫這些轉義字符斜線 "\\" 嗎?
我懷疑它實際上根本沒有添加轉義字符。 我懷疑您只是在調試器中查看字符串,這就是在添加轉義。
嘗試將其轉儲到文件或控制台。
我找到了我的字符串中有轉義字符的原因( "\\"
)。 序列化對象后,我通過 WCF 將 JSON 字符串返回給客戶端應用程序。 顯然,WCF 在將字符串發送到網絡之前會自動將這些字符添加到字符串中。 這是默認行為,顯然是強制性的。
由於我不想要這些轉義字符,因此解決方法是將服務的返回類型更改為 Stream 等,在內存流中返回您的 JSON 字符串。 它工作得很好,而且速度非常快。
它是無效的 JSON,因為序列化對象列表的結果是一個數組,即 json 將以[
開頭並以]
結尾。 要解決此問題,您需要將對象列表包裝在根對象(類的任何實例或匿名對象)中,因此,結果字符串將以{
開頭並以}
結尾。
例如:
var output = new List<object>();
var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented);
Response.Write(json);
這個有用嗎? 我在我的 WebService 中使用它來返回 Json 內容:
private HttpContent ConvertToJsonContent(object content)
{
string jsonObject = JsonConvert.SerializeObject(content, Newtonsoft.Json.Formatting.Indented);
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
如果字符串有一個“\\”,兩個“\\\\”就會回來。 您可以通過使用 Unescape 來避免這種情況
private HttpContent ConvertToJsonContent(object content)
{
string jsonObject = Regex.Unescape(JsonConvert.SerializeObject(content, Newtonsoft.Json.Formatting.Indented));
return new StringContent(jsonObject, Encoding.UTF8, "application/json");
}
我應該注意到您沒有完全引用輸出的內容(我得到了可以在您的答案中使用的網址 - 應該將其編輯到您的問題中而不是作為答案)。 我在文件中返回的字符串是這樣的:
"[{\"$id\":\"1\",\"CreationDate\":\"\\\/Date(1293186324257+0000)\\\/\",\"ImageUrl\":\"http:\/\/www.c-tina.com\/MyVoucherAdmin\/Images\/shop22\/burger.jpg\",\"Title\":\"Get one burger for free\",\"Description\":\"Bla lbzlfpzkfgmzke\\rdmjdgmj\\r\\r\\rlgfpzkegmkzepk\",\"ShopId\":22,\"PromotionId\":15,\"Shop\":null,\"Features\":[],\"SingleStats\":[],\"WhatsHots\":[],\"EntityKey\":{\"$id\":\"2\",\"EntitySetName\":\"Promotions\",\"EntityContainerName\":\"MyVoucherEntities\",\"EntityKeyValues\":[{\"Key\":\"PromotionId\",\"Type\":\"System.Int32\",\"Value\":\"15\"}]}}]"
對我來說,關鍵是前端和末尾都有未轉義的引號,這讓我認為無論輸出的是什么,都決定需要引用它,如果你用引號將它括起來,你必須轉義它里面的引號.
如果沒有看到完整的輸出,很難說問題是否出在您上面引用的代碼中以生成 JSON,或者在處理此問題的后續步驟中是否存在導致引用的問題。 您是否已調試並確認序列化調用的輸出肯定會生成轉義版本,而不是可能在稍后階段完成? 如果您不習慣調試器,請注意 Jon Skeet 將其轉儲到文件或控制台的建議,以確保不會出現混淆。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.