将 Linq 结果直接序列化为 JSON
Posted
技术标签:
【中文标题】将 Linq 结果直接序列化为 JSON【英文标题】:Serialize Linq Results directly to JSON 【发布时间】:2011-12-10 07:37:50 【问题描述】:我正在开发一个执行 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? 非常感谢所有的答案! 恩里科
【问题讨论】:
【参考方案1】:DataContractJsonSerializer 不支持匿名对象。如果你想序列化匿名对象,你可以使用JavaScriptSerializer 类:
var sb = from p in ent.people .........
var serializer = new JavaScriptSerializer();
string json = serializer.Serialize(sb);
【讨论】:
我清楚地记得我曾经使用 DataContract 序列化程序解决这个问题的团队。我们的 Web 层代码通过 WCF 服务回调到不同服务器上的存储库,虽然对查询的内容和操作有一些限制,但它确实有效。【参考方案2】:您可以为此使用Newtonsoft.JSON
语法是这样的
var sb = from p in ent.people .........
string json = JsonConvert.SerializeObject(sb);
【讨论】:
【参考方案3】:在我的上一份工作中,我们看到了这种行为,并采取了一些措施来解决它。
首先,您需要 CodePlex 免费提供的 IQ 工具包。在它的库中有一个“PartialEvaluator”,它可以通过查找总是计算为更简单节点的节点以及用常量替换对“外部闭包”的引用来降低许多表达式树的复杂性。在尝试序列化之前,您需要通过它运行您的 IQueryable。
然后,为了使用 JSON DataContract 序列化程序,您必须将希望序列化的类设置为 DataContract。到处都有这样做的教程;基本上你只是装饰类,任何包含的类,以及你想用属性序列化的成员。
一旦你有了这两个东西,你的对象和它的 IQueryable 成员应该可以使用 DataContractJsonSerializer 序列化为 JSON。
【讨论】:
所以,如果我明白我必须下载 iq 工具包(我想是一个 dll),然后我将我的 linq 结果传递给它的调用部分评估器方法,然后我可以使用 dataContractJsonSerializer 序列化操作结果? 再上一步;您必须通过使用属性装饰类及其成员来正确设置要序列化为 DataContract 的类。以上是关于将 Linq 结果直接序列化为 JSON的主要内容,如果未能解决你的问题,请参考以下文章
使用 select_related 将查询中的数据结果序列化为 json