Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 序列化实体时Json.Net出现意外字符(“\\”)_C#_Entity Framework_Wcf_Json.net - Fatal编程技术网

C# 序列化实体时Json.Net出现意外字符(“\\”)

C# 序列化实体时Json.Net出现意外字符(“\\”),c#,entity-framework,wcf,json.net,C#,Entity Framework,Wcf,Json.net,我正在使用优秀的Json.Net库序列化实体框架生成的实体。我使用以下代码执行此操作: using (MyVoucherEntities context = new MyVoucherEntities()) { List<MyObject> list = context.MyObjects.ToList(); string json = JsonConvert.SerializeObject(list); } 有人知道我为什么以及如何摆脱这些转义字符斜杠“\”?我怀疑它实际

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

using (MyVoucherEntities context = new MyVoucherEntities())
{
  List<MyObject> list = context.MyObjects.ToList();
  string json = JsonConvert.SerializeObject(list);
}
有人知道我为什么以及如何摆脱这些转义字符斜杠“\”?

我怀疑它实际上根本没有添加转义字符。我怀疑您只是在调试器中查看字符串,这就是添加转义


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

我应该注意到,您没有完全引用输出的内容(我在您的答案中找到了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的代码中,还是在后面的处理步骤中出现了导致引用的问题。您是否调试并确认serialize调用的输出肯定会生成转义版本,而不是在以后的阶段进行?如果您不习惯调试器,请注意Jon Skeet的建议,将调试器转储到文件或控制台,以确保不会出现这种混淆。

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


由于我不需要这些转义字符,解决方法是将服务的返回类型更改为Stream,从而在内存流中返回JSON字符串。它工作得很好,速度也很快。

这个有用吗?我在Web服务中使用它返回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");
}

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

例如:

var output = new List<object>();
var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented);
Response.Write(json);
var输出=新列表();
var json=JsonConvert.serialized对象(新的{root=output},格式化.Indented);
Response.Write(json);

@Jon Skeet很可能是正确的,反序列化时会出现什么问题或错误消息?反序列化的问题不是因为转义字符(),而是因为序列化文本以“[”开头,以“]”结尾。见@Jone Polvora的答案。如果你用{“dummyRoot”:和append}附加你的序列化文本,你会发现它可以序列化。克里斯,谢谢你的回答。我使用调试器进行了验证,事实上,它是在序列化时添加引号,而不是在后面的步骤中。尽管如此,我在另一个项目中尝试了相同的代码,但由于某种原因我不知道,它没有添加引号。。。可能是我正在序列化的对象的类型通过Json.net库生成了这些引号吗?我自己实际上没有使用Json.net库,所以我不确定我是否可以提供更多的建议。您可以尝试使用不同的对象和这些对象中的不同数据,看看是否会产生差异。我有点困惑它为什么会这样做,我想不出在什么情况下你会希望它这样做。如果您直接通过反序列化方法运行它,它是否按预期工作?懒散地想知道这里是否有某种虫子..呸!你明确地说它是在连载时添加它们的!很高兴你把它修好了。:)你可以+1回答你觉得很有用,虽然我不记得你是否可以在你的代表级别这样做。你得到转义字符的真正原因是因为你手动序列化你的返回值,而WCF也序列化你的(已经序列化的)返回值,这是它自然行为的一部分。因此,JSON最后包含转义字符。通过以流的形式返回,您实际上是在围绕WCF序列化程序进行结束运行。另一种可能的解决方案是简单地从方法返回非序列化对象,并让WCF对其进行序列化,但这意味着不使用Json.Net。@Brian-你说得对。我也有同样的问题,但这很烦人,因为我想要一个只由控制器使用的自定义转换器(因此,我不能将类注释为“始终使用此自定义转换器序列化”)。如果我在控制器逻辑中使用自定义转换器,我会返回一个字符串,然后WCF会重新序列化数据…转储到表单文本框对我也很有用。非常好的提示感谢Sellegant!用新的{x=y}创建对象的C#功能叫什么。我用它来进行无构造函数的实例化,但不是这样。是的,它在C#中被称为匿名类型,当您不想创建一个普通的“命名“只为这样一个简单的任务初始化。在内部,编译器将为您生成一个类,而其他答案很好地回答了为什么字符没有被转义,对于处理我遇到的类似问题,Unescape解决方案是一个快速而好的解决方案。
var output = new List<object>();
var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented);
Response.Write(json);