.net 将DataTable转换为嵌套JSON输出

.net 将DataTable转换为嵌套JSON输出,.net,sql-server,json,json.net,.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": {

我将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有一个存储/数量键/值对列表,但我不完全确定这是否正确。

您可以使用linq to sql选择表格,并使用groupby将数据放入您之前定义的对象中,该对象具有您描述的结构,之后您可以反序列化并作为json发回。

您可以使用linq to sql和执行groupby并将数据放入您之前定义的对象中,该对象具有您之后描述的结构,您可以反序列化并作为json发回。现在您将值作为键,因为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; }
}
输出

20000
20000
30000
30000
10000

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

20000
20000
30000
30000
10000

你走在正确的轨道上。要获得您在问题中概述的结构,您需要使用一个字典字典,表示每个SKU的门店数量到数量的映射。该类将如下所示:

类根对象
{
[JsonProperty(“SKU”)]
公共字典SKU{get;set;}
}
您将需要少量代码将数据表行分组到嵌套字典中,如下所示。注意:此代码假定每个SKU只会遇到一次每个门店编号。如果情况并非如此,则需要对其进行相应调整

DataTable=newdatatable();
表.列.添加(“sku”,类型(int));
表.列.添加(“存储”,类型(int));
表.列.添加(“数量”,类型(int));
表.行.添加(20000,100,3);
表.行.加(20000、132、1);
表.行.添加(20000,320,0);
表.行.添加(300002432);
表.行.添加(30000210,1);
表.行.添加(10000、410、5);
var skus=新字典();
foreach(table.Rows中的DataRow行)
{
字符串sku=行[“sku”]。ToString();
字典店;
如果(!sku.TryGetValue(sku,出库))
{
stores=新字典();
sku.Add(sku、门店);
}
添加(行[“存储”].ToString(),(int)行[“数量”];
}
RootObject root=newrootobject{Skus=Skus};
一旦将数据收集到RootObject中,就可以使用JSON.Net将其序列化为JSON:

string json=JsonConvert.serialized对象(root,Formatting.Indented);
将JSON反序列化回您的RootObject同样简单:

RootObject root=JsonConvert.DeserializeObject(json);

这是一个完整的往返演示:

你走对了方向。要获得您在问题中概述的结构,您需要使用一个字典字典,表示每个SKU的门店数量到数量的映射。该类将如下所示:

类根对象
{
[JsonProperty(“SKU”)]
公共字典SKU{get;set;}
}
您将需要少量代码将数据表行分组到嵌套字典中,如下所示。注意:此代码假定每个SKU只会遇到一次每个门店编号。如果情况并非如此,则需要对其进行相应调整

DataTable=newdatatable();
表.列.添加(“sku”,类型(int));
表.列.添加(“存储”,类型(int));
表.列.添加(“数量”,类型(int));
表.行.添加(20000,100,3);
表.行.加(20000、132、1);
表.行.添加(20000,320,0);
表.行.添加(300002432);
表.行.添加(30000210,1);
表.行.添加(10000、410、5);
var skus=新字典();
foreach(table.Rows中的DataRow行)
{
字符串sku=行[“sku”]。ToString();
字典店;
如果(!sku.TryGetValue(sku,出库))
{
stores=新字典();
sku.Add(sku、门店);
}
添加(行[“存储”].ToString(),(int)行[“数量”];
}
RootObject root=newrootobject{Skus=Skus};
一旦将数据收集到RootObject中,就可以使用JSON.Net将其序列化为JSON:

string json=JsonConvert.serialized对象(root,Formatting.Indented);
将JSON反序列化回您的RootObject同样简单:

RootObject root=JsonConvert.DeserializeObject(json);

这是一个完整的往返演示:

我在开发过程中确实在做这件事,它对我来说很好,所以我认为这是一个真正的解决方案!事实上,我在开发过程中正在这样做,它对我来说很好,所以我认为这是一个真正的解决方案!您是否尝试过任何方法来获得所需的输出?您是否尝试过任何方法来获得所需的输出?这非常有效+1是完整的往返演示。效果非常好+1用于完整的往返演示。