【问题标题】:JSON: Serializing types derived from IEnumerableJSON:序列化从 IEnumerable 派生的类型
【发布时间】:2009-09-19 18:12:50
【问题描述】:

JavaScriptSerializer 将从 IEnumerable 派生的类型序列化为 JavaScript 数组。它对数组和列表很方便,但在某些情况下,我需要序列化在派生类型中声明的属性(例如 IGrouping 中的键)。这里有一些示例代码:

var items = new[] { "aaabbb", "abcd", "bdsasd", "bsdqw" };
IGrouping<char, string> data = items.GroupBy(i => i[0]).First();
var serializer = new JavaScriptSerializer();
var serialized = serializer.Serialize(data);
// serialized == "[\"aaabbb\",\"abcd\"]"
// doesn't contain definition for IGrouping.Key property

这个问题有什么简单的解决办法吗?

【问题讨论】:

    标签: asp.net json serialization


    【解决方案1】:

    你可以试试这个:

    var items = new[] { "aaabbb", "abcd", "bdsasd", "bsdqw" };
    var data = (from x in items
                group x by x[0] into g
                select new
                {
                    Key = g.Key,
                    Value = g
                }).First();
    var serializer = new JavaScriptSerializer();
    var serialized = serializer.Serialize(data);
    

    或者如果您愿意:

    var items = new[] { "aaabbb", "abcd", "bdsasd", "bsdqw" };
    var data = items.GroupBy(i => i[0])
        .Select(x => new { Key = x.Key, Value = x })
        .First();
    var serializer = new JavaScriptSerializer();
    var serialized = serializer.Serialize(data);
    

    在这两种情况下,结果都是:

    {"Key":"a","Value":["aaabbb","abcd"]}
    

    【讨论】:

    • 我明白了你的想法,但我正在寻找一个通用的解决方案,它支持从 IEnumerable 派生的所有类型:ICollection、IGrouping、ILookup 甚至自定义用户类型
    【解决方案2】:

    查看JSON.NET。我在几个项目中使用过它,它使 JSON 序列化和反序列化变得更加容易。它将使用单个方法调用序列化大多数对象,并且还允许您使用自定义属性对序列化进行更细粒度的控制。

    这是来自作者网站的示例:

    Product product = new Product();
    
    product.Name = "Apple";
    
    product.Expiry = new DateTime(2008, 12, 28);
    
    product.Price = 3.99M;
    
    product.Sizes = new string[] { "Small", "Medium", "Large" };
    
    string json = JsonConvert.SerializeObject(product);
    
    //{
    
    //  "Name": "Apple",
    
    //  "Expiry": new Date(1230422400000),
    
    //  "Price": 3.99,
    
    //  "Sizes": [
    
    //    "Small",
    
    //    "Medium",
    
    //    "Large"
    
    //  ]
    
    //}
    
    
    
    Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);
    

    【讨论】:

    • 我也遇到了同样的问题。一些实现 IEnumerable 的自定义类型不一定有支持集合。它们可以动态生成,例如使用 'yield' 或 LINQ。在这种情况下,我想跳过默认的 JavaScript 数组序列化,只存储类的剩余成员。
    • 在这里问我的问题:stackoverflow.com/questions/15034912/…
    猜你喜欢
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    相关资源
    最近更新 更多