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

我正在使用优秀的Json.Net库来序列化由entity framework生成的实体。 我使用以下代码来执行此操作:

using (MyVoucherEntities context = new MyVoucherEntities()) { List 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将以[以#结尾]开头。 要解决此问题,您需要将对象列表包装在根对象(类的任何实例或匿名对象)中,因此,生成的字符串将以{和end with }开头。

例如:

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

我应该注意到你还没有完全引用输出的东西(我得到了你的答案中的url – 应该编辑成你的问题而不是作为答案)。 我在文件中找到的字符串是这样的:

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

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