【问题标题】:How can I serialize anonymous type using DataContractJsonSerializer [duplicate]如何使用 DataContractJsonSerializer 序列化匿名类型 [重复]
【发布时间】:2011-06-27 14:06:24
【问题描述】:

使用下面的代码,如何使用 DataContractJsonSerializer 将结果列表转换为 JSON?

ETA:我见过几种通用 JSON 化对象的扩展方法,但我不确定要使用什么类型,因为这是一种匿名类型。

<Product> products = GetProductList();

var orderGroups =
 from p in products
 group p by p.Category into g
 select new { Category = g.Key, Products = g };

谢谢!

【问题讨论】:

    标签: c# json datacontractjsonserializer


    【解决方案1】:

    您不能使用数据合同序列化程序来执行此序列化,因为匿名类型不定义任何合同。

    DataContractSerializers 使用 [DataContract] 和 [DataMember] 属性来决定哪些属性应该被序列化。但是,由于匿名类型是编译器生成的,它们不能接收属性。

    [DataContract]
    class Data
    {
        [DataMember]
        public string Category{get;set;}
        [...]
    }
    

    事实上,我的看法是,如果你的客户端和服务器之间的接口是通过匿名类型定义的,那么你做错了。

    但是,您当然可以使用另一个序列化程序来执行此任务,但我不知道任何没有任何注释的递归序列化任何公共属性。 ;)

    编辑: 事实上,我确切地知道你可以使用什么来将任意(因此是匿名的)类序列化为 json。使用奇妙的 Json.NET 库。

    【讨论】:

      【解决方案2】:

      我刚才在这里拍的代码是一个扩展方法,可以将任何东西序列化为 json http://pastebin.com/cUX82cJC

      【讨论】:

      • 我会传递什么类型,因为这是一个匿名类型?
      • 你不需要序列化。你会做string jsonData = orderGroups.JsonSerialise();
      • 如果我误解了 DataContractJsonSerializer 的工作原理,请原谅我,但是这是否适用于匿名类型,因为它没有任何 DataContractDataMember 属性。
      • 它可能是匿名的,但您应该能够知道您的实现将是什么类型,因此您可以添加任何 DataContractDataMember 属性
      • 如果类型是匿名的,则无法访问生成的类型,因为它是编译器生成的。 (编译前不可见)
      猜你喜欢
      • 2011-09-19
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2011-08-04
      • 2017-10-01
      • 1970-01-01
      相关资源
      最近更新 更多