6

我正在开发一个执行 linq to sql db 并将结果放入 VAR 变量的 WebService。然后我想使用 javascript 序列化程序(c#)将 VAR 中的结果序列化为 json 格式。像这样的东西:

var sb= from p in ent.people .........
System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new       System.Runtime.Serialization.Json.DataContractJsonSerializer(sb.GetType());
MemoryStream ms = new MemoryStream();
serializer.WriteObject(ms, sb);
string json = System.Text.Encoding.Default.GetString(ms.ToArray());

但我收到这样的错误响应:

Type      'System.Data.Objects.ObjectQuery`1[<>f__AnonymousType2d`5[System.String,System.Nu llable`1[System.Int32],System.Nullable`1[System.Int32],System.Int32,System.String]]' cannot be serialized. 

考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。如果该类型是一个集合,请考虑使用 CollectionDataContractAttribute 对其进行标记。有关其他支持的类型,请参阅 Microsoft .NET Framework 文档。

如何将 LINQ 结果直接序列化为 JSON?非常感谢所有的答案!恩里科

4

3 回答 3

5

DataContractJsonSerializer 不支持匿名对象。如果要序列化匿名对象,可以使用JavaScriptSerializer类:

var sb = from p in ent.people .........
var serializer = new JavaScriptSerializer();
string json = serializer.Serialize(sb);
于 2011-10-18T17:46:45.887 回答
5

您可以为此使用Newtonsoft.JSON

这是语法

var sb = from p in ent.people .........
string json = JsonConvert.SerializeObject(sb);
于 2018-07-06T17:53:32.000 回答
0

在我的上一份工作中,我们看到了这种行为,并采取了一些措施来解决它。

首先,您需要 CodePlex 免费提供的 IQ Toolkit。在它的库中有一个“PartialEvaluator”,它可以通过查找总是计算为更简单节点的节点以及用常量替换对“外部闭包”的引用来降低许多表达式树的复杂性。在尝试序列化它之前,您需要通过它运行您的 IQueryable。

然后,为了使用 JSON DataContract 序列化程序,您必须将希望序列化的类设置为 DataContract。到处都有这样做的教程;基本上你只是装饰类,任何包含的类,以及你想用属性序列化的成员。

一旦你有了这两个东西,你的对象和它的 IQueryable 成员应该可以使用 DataContractJsonSerializer 序列化为 JSON。

于 2011-10-18T17:51:05.603 回答