使用 LINQ 将此对象列表转换为 json

Converting this list of objects to json using LINQ

我正在尝试将一些数据转换为 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]
    }
]

你可能想要的是:

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 是这样的:

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 },
}

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

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

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

我没有在 VS 中使用您的数据对此进行测试,所以如果您在测试或理解时遇到问题,请告诉我。

这是我的变体:

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

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

 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);