如何将JSON映射到对象并返回子类对象列表?

时间:2020-11-10 02:09:42

标签: c# json object inheritance

假设我希望创建一本日记来跟踪婴儿的日常活动。

我有一个名为DiaryEntries的父类(字段:DateTime,PerformBy)

然后我有2个子类,称为: FeedingEntries(字段:FoodType,体积) DiaperingEntries(字段:PeePoop,DiaperBrand)

记录保存在JSON文件中。样本:

{
  "entries": [
    {
      "DateTime": "2020-11-02T21:38:53.4372208+08:00",
      "PerformBy": "Jane",
      "PeePoop": "Pee",
      "DiaperBrand": "Pampers"
    },
    {
      "DateTime": "2020-11-02T21:38:53.4379914+08:00",
      "PerformBy": "Andy",
      "FoodType": "Milk",
      "Volume": "120ml"
    },
    {
      "DateTime": "2020-11-02T21:38:53.438086+08:00",
      "PerformBy": "Andy",
      "PeePoop": "Poop",
      "DiaperBrand": "Diaper"
    }
  ]
}

当我希望返回DiaryEntries及其子类的列表时,如何将该JSON映射到3个对象?

如果我将JSON映射到DiaryEntries对象,那么我只会得到DateTime和PerformBy。我试图创建另一个具有所有字段的对象,但我认为这是错误的,因为下次我有另一种输入类型时,必须向该对象添加更多字段。

2 个答案:

答案 0 :(得分:0)

我不知道有任何方法可以根据找到的属性自动反序列化为不同的子类。相反,为什么不让您的属性像这样更通用:

{   
"entries": [
{
  "DateTime": "2020-11-02T21:38:53.4372208+08:00",
  "PerformBy": "Jane",
  "Activity": "Pee",
  "Details": "Pampers"
},
{
  "DateTime": "2020-11-02T21:38:53.4379914+08:00",
  "PerformBy": "Andy",
  "Activity": "Milk",
  "Details": "120ml"
},
{
  "DateTime": "2020-11-02T21:38:53.438086+08:00",
  "PerformBy": "Andy",
  "Activity": "Poop",
  "Details": "Diaper"
}   
] }

然后,您实际上只需要一个具有DateTime,PerformBy,Activity和Details属性的类。如果需要,可以使用“活动和详细信息”枚举来以编程方式区分它们。

答案 1 :(得分:0)

根据您对Jason的描述,它是有效的,并且我假设将列出子类。

{
"entries": [
{
  "DateTime": "2020-11-02T21:38:53.4372208+08:00",
  "PerformBy": "Jane",
  "DiaperingEntries ":[{
      "PeePoop": "Pee",
      "DiaperBrand": "Pampers"
  }]
},
{
  "DateTime": "2020-11-02T21:38:53.4379914+08:00",
  "PerformBy": "Andy",
  "FeedingEntries":[{
       "FoodType": "Milk",
      "Volume": "120ml"
  }]    
},
{
  "DateTime": "2020-11-02T21:38:53.438086+08:00",
  "PerformBy": "Andy",
   "DiaperingEntries ":[{
      "PeePoop": "Poop",
      "DiaperBrand": "Diaper"
  }]
}
]
}

您可以将所有内容反序列化为基础对象,然后根据需要进行投射。