【问题标题】:ASP.NET Core API empty XML objectASP.NET Core API 空 XML 对象
【发布时间】:2020-11-17 00:17:28
【问题描述】:

我有一个控制器,其中包含必须接收 XML 对象并反序列化它的 POST 方法。但经过我所有的尝试,我总是得到一个所有属性都设置为空值或默认值的空对象。

这是代码(对于这个堆很抱歉,但我认为错误可能出现在任何代码中。):

订单类:

[XmlRoot]
public class Order
{
    [XmlElement]
    public long OrderSource { get; set; }

    [XmlElement]
    public long Type { get; set; }

    [XmlElement]
    public decimal DiscountPercent { get; set; }

    [XmlElement]
    public string PayMethod { get; set; }

    [XmlElement]
    public int QtyPerson { get; set; }

    [XmlElement]
    public decimal ChangeAmount { get; set; }

    [XmlElement]
    public string Remark { get; set; }

    [XmlElement]
    public Customer Customer { get; set; }

    [XmlElement]
    public Address Address { get; set; }

    [XmlElement]
    public string AddressRemark { get; set; }

    [XmlElement]
    public Phone Phone { get; set; }

    [XmlArray(nameof(Products))]
    public List<Product> Products { get; set; }

客户类别:

[XmlRoot]
public class Customer
{
    [XmlElement]
    public string Name { get; set; }
}

地址类:

[XmlRoot]
public class Address
{
    [XmlElement]
    public string CityName { get; set; }

    [XmlElement]
    public string StreetName { get; set; }

    [XmlElement]
    public string House { get; set; }

    [XmlElement]
    public string Flat { get; set; }

    [XmlElement]
    public string Floor { get; set; }

    [XmlElement]
    public string DoorCode { get; set; }
}

还有电话类:

[XmlRoot]
public class Phone
{
    [XmlElement]
    public string Number { get; set; }
}

这是请求的正文:

<?xml version="1.0" encoding="UTF-8"?>
<Order>
    <orderSource>0</orderSource>
    <type>0</type>
    <discountPercent>0</discountPercent>
    <payMethod>string</payMethod>
    <qtyPerson>0</qtyPerson>
    <changeAmount>0</changeAmount>
    <remark>string</remark>
    <customer>
        <name>asdasd</name>
    </customer>
    <address>
        <cityName>string</cityName>
        <streetName>string</streetName>
        <house>string</house>
        <flat>string</flat>
        <floor>string</floor>
        <doorCode>string</doorCode>
    </address>
    <addressRemark>string</addressRemark>
    <phone>
        <number>string</number>
    </phone>
    <products>
        <name>string</name>
        <code>string</code>
        <qty>0</qty>
        <price>0</price>
    </products>
</Order>

请告诉我,我应该在这里更改什么,以便内置的反序列化器可以正确处理请求?提前致谢

【问题讨论】:

  • 您的问题是您的 XML 元素的 case 与 XML 不匹配。您的属性是帕斯卡大小写,但 XML 是骆驼大小写。而且,不幸的是,XML 是区分大小写的。请参阅:Is XML case-sensitive?(答案:是)和Case insensitive XML parser in c#
  • 您需要修复属性名称或通过设置设置XmlElementAttribute.ElementName 覆盖它们,如here 所示,例如[XmlElement("orderSource")]
  • @dbc 谢谢!这对我有用!您介意发布一个答案,以便我将其标记为正确答案吗?

标签: c# xml asp.net-core deserialization


【解决方案1】:

您的问题是您的 XML 元素的 case 与 XML 不匹配。您的属性是帕斯卡大小写,但 XML 是骆驼大小写。而且,不幸的是,XML 是区分大小写的。请参阅:Is XML case-sensitive?(答案:是)和Case insensitive XML parser in c#

您需要通过将XmlElementAttribute.ElementName 设置this answer 设置为XML Deserialization doesn't work with abstract class 来修复属性名称或覆盖它们,即:

public class Order
{
    [XmlElement("orderSource")]
    public long OrderSource { get; set; }

    // And similarly for all remaining properties

或者

public class Order
{
    public long orderSource { get; set; }

    // And similarly for all remaining properties

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2018-09-20
    • 2020-01-18
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    相关资源
    最近更新 更多