我有一个SQL Server源表定义为:
sku store qty
20000 100 3
20000 132 1
20000 320 0
30000 243 2
30000 210 1
10000 410 5
我需要输出为:
{
"skus": {
"20000": {
"100": 3,
"132": 1,
"320": 0
},
"30000": {
"243": "2",
"410": "1"
},
"10000": {
"410": "5"
}
}
}
我将源SQL Server表导入到数据集,然后使用JSON.NET来解析结果。我想我应该用一个有存储/数量键/值对列表的sku创建某种Class结构,但我不完全确定这是否正确。
你走在了正确的轨道上。为了获得你在问题中概述的结构,你需要使用一个字典字典,表示商店编号与每个SKU数量的映射。类看起来是这样的:
class RootObject
{
[JsonProperty("skus")]
public Dictionary<string, Dictionary<string, int>> Skus { get; set; }
}
您将需要少量的代码来将数据表行分组到嵌套字典中,如下所示。注意:此代码假设每个SKU只会遇到一次每个门店编号。如果不是这样,您需要相应地进行调整。
DataTable table = new DataTable();
table.Columns.Add("sku", typeof(int));
table.Columns.Add("store", typeof(int));
table.Columns.Add("qty", typeof(int));
table.Rows.Add(20000, 100, 3);
table.Rows.Add(20000, 132, 1);
table.Rows.Add(20000, 320, 0);
table.Rows.Add(30000, 243, 2);
table.Rows.Add(30000, 210, 1);
table.Rows.Add(10000, 410, 5);
var skus = new Dictionary<string, Dictionary<string, int>>();
foreach (DataRow row in table.Rows)
{
string sku = row["sku"].ToString();
Dictionary<string, int> stores;
if (!skus.TryGetValue(sku, out stores))
{
stores = new Dictionary<string, int>();
skus.Add(sku, stores);
}
stores.Add(row["store"].ToString(), (int)row["qty"]);
}
RootObject root = new RootObject { Skus = skus };
一旦将数据收集到RootObject中,就可以使用JSON.Net将其序列化为JSON:
string json = JsonConvert.SerializeObject(root, Formatting.Indented);
将JSON反序列化回RootObject同样简单:
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);
以下是完整的往返演示:https://dotnetfiddle.net/qR3wbE
现在您有值作为键,因为JSON
旨在按对象对记录进行分组。我建议您将JSON
更改为以下内容,这将使更容易使用
{
"skus": [
{
"sku": 20000,
"store": 100,
"qty": 1
},
{
"sku": 20000,
"store": 132,
"qty": 0
}
]
}
型号:
public class Sku
{
public int sku { get; set; }
public int store { get; set; }
public int qty { get; set; }
}
public class RootObject
{
public List<Sku> skus { get; set; }
}
将JSON
解析为C#对象
var skusObjects = JsonConvert.DeserializeObject<RootObject>(json);
foreach (var item in skusObjects.skus)
{
Console.WriteLine(item.sku);
}
输出
20000
20000
30000
30000
10000
演示
您可以使用linq-to-sql从表中进行选择,然后进行分组,并将数据放入您之前定义的对象中,该对象具有您描述的结构,然后您可以反序列化并作为json 发送回