序列化我的实体时Json.Net意外字符(“\”)

时间:2011-01-18 22:30:46

标签: c# entity-framework wcf json.net

我正在使用优秀的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\"
     } ]

有没有人知道为什么以及如何摆脱这些转义字符斜杠“\”?

5 个答案:

答案 0 :(得分:28)

我怀疑它根本不是 添加转义字符。我怀疑你只是在调试器中查看字符串,而添加转义。

尝试将其转储到文件或控制台。

答案 1 :(得分:14)

我找到了为什么我的字符串("\")中有转义字符的原因。序列化我的对象后,我通过WCF将JSON字符串返回给客户端应用程序。显然,WCF会在将字符发送到网络之前自动将这些字符添加到字符串中。这是一种默认行为,显然是强制性的。

由于我不想要这些转义字符,解决方法是将服务的返回类型更改为Stream,因此,将JSON字符串返回到内存流中。它工作得很好而且非常快。

答案 2 :(得分:3)

它是无效的JSON,因为序列化对象列表的结果是一个数组,即json将以[开头并以]结尾。要解决此问题,您需要将对象列表包装在根对象(类的任何实例或匿名对象)中,因此,生成的字符串将以{开头,以}结尾

例如:

var output = new List<object>();
var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented);
Response.Write(json);

答案 3 :(得分:1)

我应该注意到你还没有完全引用输出的内容(我得到了你的答案中的网址 - 应该编辑成你的问题而不是作为答案)。我在文件中找到的字符串是:

"[{\"$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建议将其转储到文件或控制台,以确保没有混淆。

答案 4 :(得分:1)

这个有帮助吗?我在我的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");
}