【问题标题】:Serialize Linq Results directly to JSON将 Linq 结果直接序列化为 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? 非常感谢所有的答案! 恩里科

【问题讨论】:

    标签: c# linq json serialization objectquery


    【解决方案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 的类。
      猜你喜欢
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      相关资源
      最近更新 更多