Попробуйте использовать следующую структуру классов:
public class Payload
{
public Dictionary<string, Item> Addresses { get; set; }
}
public class Item
{
public string BodyOverride { get; set; }
public string ChannelType { get; set; }
}
Предполагая, что вы начинаете с DataTable
, который выглядит следующим образом:
DataTable dataTable = new DataTable();
dataTable.Columns.Add("Address");
dataTable.Columns.Add("BodyOverride");
dataTable.Columns.Add("ChannelType");
dataTable.Rows.Add("+1713XXXXXXX", "sent", "SMS");
dataTable.Rows.Add("+1832XXXXXXX", "this is a text from PINPOINT", "SMS");
... вы можете легко конвертироватьэто к желаемой структуре класса, например:
var payload = new Payload
{
Addresses = dataTable.Rows
.Cast<DataRow>()
.ToDictionary(row => (string)row["Address"],
row => new Item
{
BodyOverride = (string)row["BodyOverride"],
ChannelType = (string)row["ChannelType"]
})
};
... и, наконец, сериализовать его в JSON, используя приличную библиотеку сериализации, такую как Json.Net :
string json = JsonConvert.SerializeObject(payload, Formatting.Indented);
Fiddle: https://dotnetfiddle.net/b7Ckzs
Важное примечание : в приведенном выше решении предполагается, что номера телефонов в столбце Address
будут различаться во всех строках DataTable
.Если это не так, то это решение не будет работать , поскольку ключи словаря должны быть уникальными.В этом случае вам нужно будет разбить данные на несколько пакетов или найти другое решение для устранения дубликатов.