.NET Core 3.1 API接收复杂XML对象时子属性为空如何解决
你当前的问题是混用了两种XML序列化器的特性,且DataContract特性配置错误,导致嵌套层级的节点无法正确映射到模型属性。具体错误点:
- 你同时注册了
DataContractSerializer和XmlSerializer两种格式化器,二者的配置特性不兼容,会出现解析逻辑冲突 Object2、Object3类上的[DataContract]的Name属性配置错误:你把类的契约名写成了上层属性的名称(Object2的Name设为了field2,Object3的Name设为了field3),导致序列化器无法匹配嵌套节点的结构- 冗余添加了
IsReference = true配置,你的XML没有循环引用场景,不需要该配置,反而会干扰正常解析。
以下两种可选解决方案二选一即可,不要混用:
方案1:使用DataContractSerializer解析
- 首先修改Startup.cs的配置,只保留DataContract序列化器的注册,移除XmlSerializer的注册:
services.AddControllers().AddXmlDataContractSerializerFormatters();
- 修正模型类的特性配置,删掉错误的Name和IsReference配置:
[DataContract(Namespace = "")] public class Object1 { [DataMember(Name = "field1")] public string field1 { get; set; } [DataMember(Name = "field2")] public Object2 field2 { get; set; } } [DataContract] public class Object2 { [DataMember(Name = "field3")] public string field3 { get; set; } [DataMember(Name = "field4")] public Object3 field4 { get; set; } } [DataContract] public class Object3 { [DataMember(Name = "field5")] public string field5 { get; set; } [DataMember(Name = "field6")] public string field6 { get; set; } }
方案2:使用XmlSerializer解析
- 修改Startup.cs配置,只保留XmlSerializer的注册:
services.AddControllers().AddXmlSerializerFormatters();
- 移除所有DataContract相关特性,改为使用Xml序列化特性配置:
[XmlRoot("Object1")] public class Object1 { [XmlElement("field1")] public string field1 { get; set; } [XmlElement("field2")] public Object2 field2 { get; set; } } public class Object2 { [XmlElement("field3")] public string field3 { get; set; } [XmlElement("field4")] public Object3 field4 { get; set; } } public class Object3 { [XmlElement("field5")] public string field5 { get; set; } [XmlElement("field6")] public string field6 { get; set; } }
注意:请求时需要确保Header中的
Content-Type值为application/xml,不要携带额外的namespace参数。
内容的提问来源于stack exchange,提问作者TJ Lopez
相关产品推荐
相关产品推荐

