簡體   English   中英

序列化我的實體時 Json.Net 意外字符(“\\”)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM