【问题标题】:Serialize JSON with numbers as property names使用数字作为属性名称序列化 JSON
【发布时间】:2018-11-12 22:42:05
【问题描述】:

如何将包含电话号码列表BodyOverrideChannelTypeDataTable 序列化为该结构?最终的 JSON 应该类似于下面的示例。我看到一些建议使用字典的帖子,但不是我不确定我是否能做到这一点。

{
  "Addresses": {
    "+1713XXXXXXX": {
      "BodyOverride": "sent",
      "ChannelType": "SMS"
    },
    "+1832XXXXXXX": {
      "BodyOverride": "this is a text from PINPOINT",
      "ChannelType": "SMS"
    }
  }
}

【问题讨论】:

标签: c# json serialization


【解决方案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 的所有行中都是不同的。如果不是,则此解决方案将不起作用,因为字典键必须是唯一的。在这种情况下,您需要将数据拆分为多个批次,或者寻找其他解决方案来处理重复数据。

【讨论】:

  • 非常感谢布赖恩。这非常有帮助。我以前从未使用过 Dictionary,所以我很难弄清楚如何加载它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 1970-01-01
  • 2021-12-10
相关资源
最近更新 更多