【发布时间】:2021-11-22 00:46:29
【问题描述】:
我正在开发一个 ASP .NET 核心 web api,我试图在 C# 中创建一个基于 JSON 的模型,该模型可以具有动态属性。
- 类型字段可以是 3 种类型:土地、水、空气。 根据类型,“源”中的相应属性会有所不同。
例如。如果类型是“陆地”,则源中将有一个名为“速度”的附加属性。如果类型为“Air”,源中将有 2 个附加属性,称为“Height”和“NumberLandings”。
- modify 属性是一个数组,可以有不同类型的修改 - 性能/美学/功能......,根据修改类型,我可以在下面为该修改设置不同的属性。
例如,如果类型为“Performance”,则会有其他属性,例如刹车/涡轮增压/悬架。
{
"properties": {
"source": {
"type": "Land",
"speed": "160mph"
},
"modify ": [
{
"type": "Performance",
"brakes": "",
"turbo": "",
"suspension": ""
},
{
"type": "Functional",
"electric": "",
"applications": "Carplay"
}
]
}
}
问题:如何为动态 JSON 构建我的 C# 类/模型?我正在考虑将源类型和修改类型保持为枚举,并根据枚举类型定义其他参数。
我不想定义所有属性并最终将其中一些属性设置为 null,如下所示:
[DataContract]
public class Source
{
[DataMember]
[JsonProperty(PropertyName = "type")]
public string Type { get; set; }
[DataMember]
[JsonProperty(PropertyName = "speed")]
public string Speed{ get; set; }
[DataMember]
[JsonProperty(PropertyName = "height")]
public string Height{ get; set; }
[DataMember]
[JsonProperty(PropertyName = "NumberLandings")]
public string NumberLandings { get; set; }
}
【问题讨论】:
-
那么呈现的属性直接对应类型?
-
您唯一的其他选择是编写一个自定义 JSON 反序列化器,读取
properties.source.type并基于此,将properties.modify读取到特定对象中。然后你的反序列化方法将返回一个(VehicleType, object)的元组,并基于前者,你转换后者。这很丑,这也是返回不同 JSON 的 API 被认为很差的原因。
标签: c# json asp.net-core .net-core