为动态 JSON 创建 C# 模型

Posted

技术标签:

【中文标题】为动态 JSON 创建 C# 模型【英文标题】:Creating C# models for a dynamic JSON 【发布时间】: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 被认为很差的原因。 【参考方案1】:

类型字段可以是 3 种类型:土地、水、空气。根据类型,“源”中的相应属性会有所不同。

这本质上是多态,关于这个有existing questions和articles。这可能需要一个自定义的 jsonConverter 类,如果您将消息格式化为具有单独的对象而不是松散的属性,则可能会更容易,即:

"type": "Land",
 "MyBaseObject":           
      "speed": "160mph"
  

modify 属性是一个数组,可以有不同类型的修改 - Performance/Aesthetic/Functional....,根据修改类型,我可以在下面为该修改设置不同的属性。

这听起来像是键值存储,并且可以使用与上述相同的多态方法来存储不同类型对象的不同属性,即它可以用Dictionary<string, MyModificationBase> 表示。

请记住,您仍然需要以某种方式使用对象模型,最好不需要到处进行类型检查。

【讨论】:

以上是关于为动态 JSON 创建 C# 模型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用动态对象类创建 .net 核心 MVC 模型?

嵌套数组 JSON 的 Mongoose 模型

自定义验证属性未在模型上验证 - WebAPI C# 和 JSON

threejs将动态模型转化为动态粒子效果

创建从 C# 到 JavaScript 的动态 JSON

为JSON创建模型,其中键是android中的值