使用 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);
我正在尝试将一些数据转换为 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);