基于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类型,值类型不兼容
- JSON中
- 类职责完全错位
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
相关产品推荐
相关产品推荐

