对象匹配对象和字符串

时间:2016-11-03 08:50:16

标签: c# xml rest

我从XML文件中读取销售订单,并将DTO发送到客户是字符串的restful API。返回的DTO包含客户对象,因此与输入对象中的字符串不匹配。

有没有办法创建Customer对象,以便客户字符串作为DTO和返回的客户对象都有效?

基本上我想将字符串客户读入客户对象,并让API认为它只是客户字符串而不是客户对象。

XML文件:

<SalesOrder>
  <orderType>SO</orderType>
  <customer>10000</customer>
</SalesOrder>

从API返回的客户对象:

 <customer>
      <number>10000</number>
      <internalId>2462</internalId>
      <lastModifiedDateTime>0001-01-01</lastModifiedDateTime>
     </customer>

客户在SalesOrder中获取和设置方法

[XmlElement("customer")]
public Customer customer
{
    get { return Get("customer", new Customer()); }
    set { Set(value); }
}

2 个答案:

答案 0 :(得分:0)

考虑使用Newtonsoft.Json进行序列化&amp;反序列化

序列化示例:

var customer = new Customer();
var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(Customer); 

反序列化@服务器端

var customer = Newtonsoft.Json.JsonConvert.DeserializeObject(serializedObject);

其中 serializedObject 是从请求中获取的字符串。

答案 1 :(得分:0)

为了澄清您的问题,您希望能够设计Customer DTO,以便它可以用于反序列化以下简单的XML:

<SalesOrder>
  <orderType>SO</orderType>
  <customer>10000</customer>
</SalesOrder>

以及以下更复杂的XML:

<SalesOrder>
  <orderType>SO</orderType>
  <customer>
      <number>10000</number>
      <internalId>2462</internalId>
      <lastModifiedDateTime>0001-01-01</lastModifiedDateTime>
  </customer>
</SalesOrder>

但是,以下XML无效并且尝试反序列化它应该抛出异常,因为它既有简单的客户编号又有一组复杂的客户值:

<SalesOrder>
  <orderType>SO</orderType>
  <customer>10000<number>10000</number>
      <internalId>2462</internalId>
      <lastModifiedDateTime>0001-01-01</lastModifiedDateTime>
  </customer>
</SalesOrder>

您还希望能够选择是否应以简单或复杂的格式重新序列化客户。

这可以使用XmlSerializer来完成,但是对于可能具有文本值的元素类型没有内置支持,或者可能具有一系列子元素 - 但不能同时支持两者。因此,您需要在类本身中支持此逻辑。以下是:

[XmlRoot(ElementName = "customer")]
public class Customer
{
    bool? isSimpleFormat;

    [XmlIgnore]
    public bool IsSimpleFormat { get { return isSimpleFormat == true; } set { isSimpleFormat = value; } }

    [XmlIgnore]
    bool IsSimpleFormatDefined { get { return isSimpleFormat != null; } }

    [XmlIgnore]
    bool IsComplexPropertySpecified
    {
        get
        {
            return !IsSimpleFormat;
        }
        set
        {
            if (IsSimpleFormatDefined && IsSimpleFormat)
            {
                throw new InvalidOperationException("Cannot set a complex property on a simple customer");
            }
            IsSimpleFormat = !value;
        }
    }

    [XmlElement(ElementName = "number")]
    public string Number { get; set; }

    [XmlIgnore]
    public bool NumberSpecified { get { return IsComplexPropertySpecified; } set { IsComplexPropertySpecified = value; } }

    [XmlElement(ElementName = "internalId")]
    public string InternalId { get; set; }

    [XmlIgnore]
    public bool InternalIdSpecified { get { return IsComplexPropertySpecified; } set { IsComplexPropertySpecified = value; } }

    [XmlElement(ElementName = "lastModifiedDateTime")]
    public string LastModifiedDateTime { get; set; }

    [XmlIgnore]
    public bool LastModifiedDateTimeSpecified { get { return IsComplexPropertySpecified; } set { IsComplexPropertySpecified = value; } }

    [XmlText]
    public string SimpleNumber
    {
        get 
        {
            return IsSimpleFormat ? Number : null; 
        }
        set
        {
            IsComplexPropertySpecified = false;
            Number = value;
        }
    }
}

[XmlRoot(ElementName = "SalesOrder")]
public class SalesOrder
{
    [XmlElement(ElementName = "orderType")]
    public string OrderType { get; set; }
    [XmlElement(ElementName = "customer")]
    public Customer Customer { get; set; }
}

一些注意事项:

  1. 最初构造时,Customer默认为复杂格式,但会根据反序列化过程中是否遇到子元素或文本值进行调整。一旦设置了格式,它将不再适应,如果以错误的格式遇到其他节点,则会抛出异常。

  2. 在构建之后的任何时候,您的代码都可以通过设置布尔属性Customer来更改是否要以简单或复杂格式序列化Customer.IsSimpleFormat

  3. 该类型利用XmlSerializer Customer模式来跟踪和控制 Button btnActivityB = (Button) findViewById(R.id.some_button); btnActivityB.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(this, MapActivity.class); LatLng latLng = new LatLng(-20.65,-40.79) //Or any other value... intent.put("LatLng", latLng); startActivity(intent); } }); 的子属性是否被反序列化,并且应该被序列化。

  4. 通过使用*Specified标记该POCO的属性,可以将与复杂POCO对应的元素的XML文本值映射到属性。

  5. 示例[XmlText]