2014-11-05 77 views
0

我有一個SQL Server源表定義爲:轉換的DataTable嵌套JSON輸出

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的類結構,它有一個存儲/數量鍵/值對列表,但我不完全確定這是否是正確的軌道。

+0

你嘗試過什麼讓d esired輸出? – 2014-11-05 10:12:11

回答

4

你在正確的軌道上。要獲得您問題中列出的結構,您需要使用代表商店編號與每個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

+0

完美運作。 +1的完整往返演示。 – jared 2014-11-06 00:44:21

+0

很高興我能幫到你。 – 2014-11-06 00:46:14

0

您可以使用linq-to-sql選擇表格,並執行groupby並將數據放入之前定義的對象中,該對象具有您在之後描述的結構,然後您可以反序列化併發送回json

+0

我在我的開發中實際上是這樣做的,它對我來說工作得很好,所以我認爲這被認爲是一個真正的解決方案! – 2014-11-05 09:13:21

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