将Linq结果直接序列化为JSON

时间:2011-10-18 17:40:52

标签: c# linq json serialization objectquery

我正在开发一个超出linq到sql db的WebService,并将结果放入VAR变量中。然后我想使用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? 非常感谢所有答案! 恩里科

3 个答案:

答案 0 :(得分:4)

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

var sb = from p in ent.people .........
var serializer = new JavaScriptSerializer();
string json = serializer.Serialize(sb);

答案 1 :(得分:2)

您可以为此使用Newtonsoft.JSON

这是语法

var sb = from p in ent.people .........
string json = JsonConvert.SerializeObject(sb);

答案 2 :(得分:0)

在我上一份工作中,我们看到了这种行为,并且花了一些时间来解决它。

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

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

一旦你有了这两件事,你的对象及其IQueryable成员应该可以使用DataContractJsonSerializer序列化为JSON。