使用数字作为属性名称序列化JSON

时间:2018-11-12 22:42:05

标签: c# json serialization

如何将包含电话号码列表DataTableBodyOverride的{​​{1}}序列化到此结构?最终的JSON应该类似于以下示例。我看到一些建议使用字典的帖子,但不确定我是否可以实现。

ChannelType

1 个答案:

答案 0 :(得分:1)

尝试这样的使用类结构:

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.Net这样的体面的序列化库将其序列化为JSON:

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

提琴:https://dotnetfiddle.net/b7Ckzs

重要提示:以上解决方案假定Address列中的电话号码在DataTable中的所有行中都是不同的。如果不是,则该解决方案将不起作用,因为字典键必须唯一。在这种情况下,您将需要将数据分为多个批次,或者找到其他解决方案来处理重复项。