You need to enable JavaScript to run this app. 基于IEnumerable<>实现Json转C#类的模型正确性校验及自定义转换器开发咨询
优惠活动
大模型
产品
解决方案
定价
更多

基于IEnumerable<>实现Json转C#类的模型正确性校验及自定义转换器开发咨询

模型校验结论

当前编写的C#模型存在多处结构性错误,完全无法匹配给定的JSON结构,必须完成针对性调整后,才能开展后续自定义Json转换器的开发工作。

现存核心问题

  • 继承关系设计完全错误
    现有代码中类之间采用了多层继承:ClusterConfigurationModelStep继承ClusterConfigurationModel、ClusterConfigurationServerConfig继承ClusterConfigurationModelStep、ClusterConfigurationDbPrimaryServer继承ClusterConfigurationServerConfig。JSON结构里的各节点是组合层级关系,不属于面向对象的“is a”继承关系,这种写法会导致子类自动携带大量无关的父类属性,最终生成的类型结构与实际JSON完全脱节。
  • 属性只读无赋值入口
    所有类的属性仅声明了get访问器,没有配置set访问器。无论是系统内置的JSON序列化组件,还是后续开发的自定义转换器,都无法给只读属性赋值,反序列化流程会直接失败。
  • 属性命名与JSON字段不匹配
    JSON中步骤节点的字段为stepsType,模型中定义的属性名为StepType,默认序列化规则下会因大小写不匹配,无法正确识别对应字段。
  • 属性类型与JSON结构错位
    • JSON中config是单个嵌套对象,模型中定义为IEnumerable<ClusterConfigurationServerConfig>集合类型,结构完全不符
    • JSON中activeDbPrimaryServer是单个服务器对象,模型中定义为IEnumerable<ClusterConfigurationDbPrimaryServer>集合类型
    • JSON中activeIntegratedSecurity是布尔值,模型中定义为string类型,值类型不兼容
  • 类职责完全错位
    ClusterConfigurationDbPrimaryServer本应是独立的数据库主服务器信息类型,不需要关联配置类、步骤类的任何属性,当前将其设置为配置类的子类,会导致该类凭空多出大量无关属性。

调整后的正确基础模型

namespace Microsoft.Database.Configuration.Model
{
    /// <summary>
    /// 最外层配置根对象
    /// </summary>
    public class ClusterConfigurationModel
    {
        /// <summary>
        /// 对应JSON中的steps步骤集合
        /// </summary>
        public List<ClusterConfigurationModelStep> Steps { get; set; }
    }

    /// <summary>
    /// 单个配置步骤节点
    /// </summary>
    public class ClusterConfigurationModelStep
    {
        /// <summary>
        /// 步骤类型,与JSON字段名完全匹配
        /// </summary>
        public string stepsType { get; set; }

        /// <summary>
        /// 向导类型,与JSON字段名完全匹配
        /// </summary>
        public string wizardType { get; set; }

        /// <summary>
        /// 步骤关联的配置对象,为单个实例而非集合
        /// </summary>
        public ClusterConfigurationServerConfig config { get; set; }
    }

    /// <summary>
    /// 服务器配置节点,无多余继承
    /// </summary>
    public class ClusterConfigurationServerConfig
    {
        public string mode { get; set; }
        public string resourceName { get; set; }

        /// <summary>
        /// 数据库主服务器信息,为单个实例而非集合
        /// </summary>
        public ClusterConfigurationDbPrimaryServer activeDbPrimaryServer { get; set; }

        public string activeDbCatalog { get; set; }
        public string activeDBUserId { get; set; }
        public string activeDBPassword { get; set; }

        /// <summary>
        /// 匹配JSON中的布尔值类型
        /// </summary>
        public bool activeIntegratedSecurity { get; set; }
    }

    /// <summary>
    /// 数据库主服务器信息节点,无多余继承
    /// </summary>
    public class ClusterConfigurationDbPrimaryServer
    {
        public string serverName { get; set; }
        public string serverAddress { get; set; }
    }
}

自定义转换器开发前置提示

  • 必须先保证基础模型的结构、属性类型、命名与JSON完全对齐,自定义转换器才能正常运行。在基础结构错位的情况下开发转换器,会额外增加大量无意义的适配工作量。
  • 如果业务场景需要根据wizardType的不同,动态加载不同类型的配置实现,再结合接口、抽象基类、JsonConverterFactory实现多态反序列化才是合理的技术选型,不要在基础模型未对齐时提前引入复杂的转换逻辑。

内容的提问来源于stack exchange,提问作者horizon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 13:45:00