【问题标题】:Converting this list of objects to json using LINQ使用 LINQ 将此对象列表转换为 json
【发布时间】:2015-03-10 20:39:09
【问题描述】:

我正在尝试将一些数据转换为 HighCharts 库为其系列数据所期望的 json 对象。这是格式:

var series = [
        {
            name : "Duplicate Transactions"
            data : [190, 107]
        },
        {
            name : "Unique Transactions"
            data : [55, 51]
        }
    ]

我的后端代码中有这样的对象列表:

UsageData usageData = new UsageData()
{
    {UsageType = "FIND", DupTrans  = 190, UniqTrans = 55 },
    {UsageType = "PARTS", DupTrans  = 107, UniqTrans = 51 }
};

到目前为止,我有这个:

var dup = usageData.GroupBy(d => d.DuplicateTransactions)
    .Select(g => new
    {
        name = "Duplicate Transactions",
        usageData = g.Select(c => c.DuplicateTransactions).ToArray()
    });

var uniq = usageData.GroupBy(d => d.UniqueTransactions)
    .Select(g => new
    {
        name = "Unique Transactions",
        usageData = g.Select(c => c.UniqueTransactions).ToArray()
    });

但是我得到的输出不是我们想要的:

[
    {
        "name" : "Duplicate Transactions",
        "data" : [190]
    },
    {
        "name" : "Duplicate Transactions",
        "data" : [107]
    }
]

[
    {
        "name" : "Unique Transactions",
        "data" : [55]
    },
    {
        "name" : "Unique Transactions",
        "data" : [51]
    }
]

【问题讨论】:

  • 你能指出输出有什么问题吗?预期的格式是什么?它看起来和第一个完全一样。编辑:我想我明白了,但它仍然有点令人困惑。
  • 在第一个中,每个事务的数据被分组。在第一个对象中,数据是 190 和 107 一起。在我的输出中,它们是分开的。
  • 您正在使用UniqueTransactionsDuplicateTransactions 属性作为组的键,因此它按它们分组,因为它们是唯一的。如果您不需要按键对项目进行分组,则此处不需要GroupBy。您需要删除 GroupBy 呼叫并仅使用 Select 呼叫而不进行分组。
  • 好的,所以我删除了 GroupBy 并这样做了:var uniq = data.Select(d => new { name = "Unique Transactions", data = d.UniqueTransactions }); 仍然给我相同的输出。
  • 我为什么不走明显的路线?总是想太多。

标签: c# json linq highcharts


【解决方案1】:

您可以再添加一个将被序列化的数据类。参考下面的代码。

 class Output
{
    public string Name { get; set; }
    public int[] DupTrans { get; set; }
}

class UsageData
{
    public string UsageType { get; set; }
    public int DupTrans { get; set; }
    public int UniqTrans { get; set; }
}
 List<UsageData> usageData = new List<UsageData>()
        {
            new UsageData(){UsageType = "FIND", DupTrans  = 190, UniqTrans = 55 },
            new UsageData(){UsageType = "PARTS", DupTrans  = 107, UniqTrans = 51 }
        };

        var myObj = new { Name = "Duplicate Transactions", DupTrans = usageData.Select(x => x.DupTrans).ToArray() };
        string str = JsonConvert.SerializeObject(myObj);

【讨论】:

  • 谢谢,我使用了你的方法,但是使用了匿名类型。
  • 用匿名类型更新了我的帖子。对不起,我只关心输出。
【解决方案2】:

这是我的变种:

var usageData = new List<UsageData>()
{
    new UsageData {UsageType = "FIND", DupTrans  = 190, UniqTrans = 55 },
    new UsageData {UsageType = "PARTS", DupTrans  = 107, UniqTrans = 51 }
};

var dup = usageData
        .GroupBy(p => "Duplicate Transactions", p => p.DupTrans)
        .Select(g => new {
            name = "Duplicate Transactions",
            data = g.ToList()
        }).First();

Console.WriteLine(dup.name);
Console.WriteLine(string.Join(",", dup.data));

var uniq  = usageData
            .GroupBy(p => "Unique Transactions", p => p.UniqTrans)
            .Select(g => new {
                name = "Unique Transactions",
                data = g.ToList()
            }).First();

Console.WriteLine(uniq.name);
Console.WriteLine(string.Join(",", uniq.data));

本示例使用常量键作为分组键,因此所有项目将被分组为一个,然后可以与序列化程序一起使用。

以下代码使用Console.WriteLine 生成这样的输出:

Duplicate Transactions
190,107
Unique Transactions
55,51

这是 DotNetFiddle 中的一个工作示例 - https://dotnetfiddle.net/IEwoDC

【讨论】:

    【解决方案3】:

    你可能想要的是这样的:

    var grp = usageData
                    .GroupBy(u => u.name)
                    .Select(g => new 
                        { 
                            name = g.Key, 
                            data = g.Select(u => u.data).ToArray() 
                        });
    

    我基于您最初提供的数据(如上面查询的输出与下面的匹配):

    var series = [
        {
            name : "Duplicate Transactions"
            data : [190, 107]
        },
        {
            name : "Unique Transactions"
            data : [55, 51]
        }
    ]
    

    这会假设你的类是这样的:

    class serie
    {
        public string name;
        public int data;
    }
    

    你的数据是这样的:

    var usageData = new[] 
    {
        new serie { name = "Duplicate Transactions", data = 190 },
        new serie { name = "Duplicate Transactions", data = 107 },
        new serie { name = "Unique Transactions", data = 55 },
        new serie { name = "Unique Transactions", data = 51 },
    }
    

    您设计课程的方式与上述任何内容都不一致:

    UsageData usageData = new UsageData()
    {
        {UsageType = "FIND", DupTrans  = 190, UniqTrans = 55 },
        {UsageType = "PARTS", DupTrans  = 107, UniqTrans = 51 }
    };  
    

    所以我不确定我是否有帮助,但我提供的示例肯定会产生您最初发布的 JSON 结果。

    我没有在 VS 中使用您的数据对此进行测试,因此请告诉我您是否在测试或理解方面遇到了困难。

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-17
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-08
      相关资源
      最近更新 更多