2014-11-05 7 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, имеющего список пар ключей/значений store/qty, но я не совсем уверен, что это правильный трек или нет.

+0

вы пытались что-нибудь, чтобы получить д ? –

ответ

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 с помощью Json.NET:

string json = JsonConvert.SerializeObject(root, Formatting.Indented); 

десериализации JSON обратно в RootObject так же просто:

RootObject root = JsonConvert.DeserializeObject<RootObject>(json); 

Вот полный туда-обратно демо: https://dotnetfiddle.net/qR3wbE

+0

Это сработало отлично. +1 для полной демонстрации в оба конца. – jared

+0

Рад, что я мог помочь. –

0

Вы можете сделать выбор из таблицы с помощью linq-to-sql и выполнить groupby и поместить данные в объект, который вы определили, до которого будет описана структура, после которой вы можете десериализовать и отправить обратно как json

+0

Я на самом деле делаю это в своем развитии, и он отлично работает со мной, поэтому это считается реальным решением, как я полагаю! –

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

Смежные вопросы