将DataTable转换为嵌套的JSON输出

时间:2014-11-05 08:11:46

标签: .net sql-server json json.net

我有一个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表导入DataSet,然后使用JSON.NET来解析结果。我在想我应该创建某种类型的结构,其中sku有一个store / qty键/值对的列表,但我不完全确定它是否是正确的轨道。

3 个答案:

答案 0 :(得分:5)

你走在正确的轨道上。要获得您在问题中概述的结构,您需要使用字典词典来表示商店编号与每个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

答案 1 :(得分:1)

现在您将值作为键,因为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

DEMO

答案 2 :(得分:0)

您可以使用linq-to-sql选择表格并执行groupby并将数据放入您之前定义的对象之前,该对象具有您之后描述的结构,您可以反序列化并以json的形式发送回来p>