【问题标题】:C# JSON How to serialize a list with the class name as a node nameC# JSON 如何以类名作为节点名序列化列表
【发布时间】:2020-10-19 17:44:11
【问题描述】:

我想用类名作为被序列化的子元素的父名序列化一个列表,格式如下:

"parent": [
   "title": "",
   "child_items" : [
      "child_item" : {
         "field1": "1",
         "field2": "2"
       },
      "child item" : {
         "field1": "1",
         "field2": "2"
      }
   ]
]

我有一个名为 Parent 的类,我有一个名为 ChildItem 的类。我在父类上有一个属性,它是 ChildItems 的列表以及 title 属性。

当我使用 Newtonsoft.Json.JsonConvert.SerializeObject 对其进行序列化时,我得到以下信息:

"parent": [
   "title": "",
   "child_items" : [
      {
         "field1": "1",
         "field2": "2"
       },
      {
         "field1": "1",
         "field2": "2"
      }
   ]
]

如果我创建一个名为 ChildItems 的单独类,它的属性是 ChildItem 的列表,并使 ChildItems 类成为 Parent 的属性,那么我会得到以下信息:

"parent": [
   "title": "",
   "child_items" : {
      "child_item" : [
         {
            "field1": "1",
            "field2": "2"
         },
         {
            "field1": "1",
            "field2": "2"
         }
      ]
   }
]

我希望输出将 child_items 显示为 child_item 列表,每个子字段都在下面。

编辑: 这是我创建的一个示例:https://dotnetfiddle.net/ozJK9B。我想让“ChildItem”显示为“ChildItems”下的项目列表,并让 ChildItem 属性显示在每个 ChildItem 下方。

【问题讨论】:

  • 如果您需要类型信息,您可以使用TypeNameHandling setting,但输出会与您请求的不同。
  • 你能添加你的类的 sn-p 和你想要的输出吗?
  • 这是我创建的一个示例:dotnetfiddle.net/ozJK9B。我想让“ChildItem”显示为“ChildItems”下的项目列表,并让 ChildItem 属性显示在每个 ChildItem 下方。

标签: c# json serialization


【解决方案1】:

也许可以解释为什么您想更改序列化而不是满足于序列化反映您的类结构。您是否需要反映这种结构以符合期望这种数据结构的服务?

如果您需要遵守 json 结构,例如数据合约,那么也许可以看看其中一个子解析器,它将生成反映 json 数据集的类

https://json2csharp.com/ 是您可以使用的一种

【讨论】:

  • 不错的工具。谢谢。我试图使我的输出符合使用 JSON 将订单导入 Salesforce 的预期格式。
  • @user1408767,我想了这么多,只是要知道解析器正在为所有东西创建一个类,所以不要盲目地接受他们提供的东西。另外,请注意 JsonProperty("Name") 注释,因为它允许您使用原本非法的属性名称,并有助于避免在混淆代码时出现混乱,因为它不映射属性名称而是属性。然后,您可以将“First-Name”之类的想法映射到 FirstName
【解决方案2】:

我知道我需要做什么。父项必须具有子项列表的属性。子项类将具有一个属性,即子项详细信息。 这是我写的一个例子: https://dotnetfiddle.net/lgz7CV

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-05
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 2011-01-26
    • 1970-01-01
    相关资源
    最近更新 更多