我正在使用优秀的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\"
} ]
有没有人知道为什么以及如何摆脱这些转义字符斜杠“\”?
答案 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");
}