使用 RestSharp 序列化具有一个值的对象集合
Serialize collection of objects with one value using RestSharp
我需要下一个xml数据:
<trackingrequest>
<user>USERNAME</user>
<password>PASSWORD</password>
<trackingnumbers>
<trackingnumber>12345678901</trackingnumber>
</trackingnumbers>
</trackingrequest>
为此,我创建了下一个模型:
[SerializeAs(Name = "trackingrequest")]
public class DpdTrackingRequest
{
[SerializeAs(Name = "user")]
public string User { get; set; }
[SerializeAs(Name = "password")]
public string Password { get; set; }
[SerializeAs(Name = "trackingnumbers")]
[XmlArrayItem("trackingnumber")]
public IList<DpdTrackingNumber> TrackingNumbers { get; set; }
}
public class DpdTrackingNumber
{
public string Value { get; set; }
}
但是当我调用 AddXmlBody
方法时,我看到了下一个结果:
<trackingrequest>
<user>USERNAME</user>
<password>PASSWORD</password>
<trackingnumbers>
<DpdTrackingNumber>
<Value>12345678901</Value>
</DpdTrackingNumber>
</trackingnumbers>
</trackingrequest>
如何在 <trackingnumber>12345678901</trackingnumber>
中合并 <DpdTrackingNumber><Value>12345678901</Value></DpdTrackingNumber>
?
为了达到您的要求,我认为您必须将 System.Xml.Serialization.XmlTextAttribute
设置为 DpdTrackingNumber.Value
属性。
但是,RestRequest
的 XmlSerializer
默认为 RestSharp.Serializers.XmlSerializer
,它无法读取 System.Xml.Serialization
属性。
因此,您必须在调用 AddXmlBody
方法之前将 XmlSerializer
重置为 RestSharp.Serializers.DotNetXmlSerializer
。
dpdTrackingRequest.TrackingNumbers = new List<DpdTrackingNumber>();
dpdTrackingRequest.TrackingNumbers.Add(new DpdTrackingNumber { Value = "12345678901" });
RestRequest restRequest = new RestRequest();
// reset XmlSerializer
restRequest.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();
var result = restRequest.AddXmlBody(dpdTrackingRequest);
此外,您可能必须将 TrackingNumbers
的类型从 IList
更改为 List
,因为 DotNetXmlSerializer
无法序列化接口,因此 DpdTrackingRequest
class如下:
using System.Xml.Serialization;
//was [SerializeAs(Name = "trackingrequest")]
[XmlRoot("trackingrequest")]
public class DpdTrackingRequest
{
//was [SerializeAs(Name = "user")]
[XmlElement("user")]
public string User { get; set; }
//was [SerializeAs(Name = "password")]
[XmlElement("password")]
public string Password { get; set; }
//was [SerializeAs(Name = "trackingnumbers")]
//from IList to List
[XmlArray("trackingnumbers")]
[XmlArrayItem("trackingnumber")]
public List<DpdTrackingNumber> TrackingNumbers { get; set; }
}
public class DpdTrackingNumber
{
[XmlText]
public string Value { get; set; }
}
我需要下一个xml数据:
<trackingrequest>
<user>USERNAME</user>
<password>PASSWORD</password>
<trackingnumbers>
<trackingnumber>12345678901</trackingnumber>
</trackingnumbers>
</trackingrequest>
为此,我创建了下一个模型:
[SerializeAs(Name = "trackingrequest")]
public class DpdTrackingRequest
{
[SerializeAs(Name = "user")]
public string User { get; set; }
[SerializeAs(Name = "password")]
public string Password { get; set; }
[SerializeAs(Name = "trackingnumbers")]
[XmlArrayItem("trackingnumber")]
public IList<DpdTrackingNumber> TrackingNumbers { get; set; }
}
public class DpdTrackingNumber
{
public string Value { get; set; }
}
但是当我调用 AddXmlBody
方法时,我看到了下一个结果:
<trackingrequest>
<user>USERNAME</user>
<password>PASSWORD</password>
<trackingnumbers>
<DpdTrackingNumber>
<Value>12345678901</Value>
</DpdTrackingNumber>
</trackingnumbers>
</trackingrequest>
如何在 <trackingnumber>12345678901</trackingnumber>
中合并 <DpdTrackingNumber><Value>12345678901</Value></DpdTrackingNumber>
?
为了达到您的要求,我认为您必须将 System.Xml.Serialization.XmlTextAttribute
设置为 DpdTrackingNumber.Value
属性。
但是,RestRequest
的 XmlSerializer
默认为 RestSharp.Serializers.XmlSerializer
,它无法读取 System.Xml.Serialization
属性。
因此,您必须在调用 AddXmlBody
方法之前将 XmlSerializer
重置为 RestSharp.Serializers.DotNetXmlSerializer
。
dpdTrackingRequest.TrackingNumbers = new List<DpdTrackingNumber>();
dpdTrackingRequest.TrackingNumbers.Add(new DpdTrackingNumber { Value = "12345678901" });
RestRequest restRequest = new RestRequest();
// reset XmlSerializer
restRequest.XmlSerializer = new RestSharp.Serializers.DotNetXmlSerializer();
var result = restRequest.AddXmlBody(dpdTrackingRequest);
此外,您可能必须将 TrackingNumbers
的类型从 IList
更改为 List
,因为 DotNetXmlSerializer
无法序列化接口,因此 DpdTrackingRequest
class如下:
using System.Xml.Serialization;
//was [SerializeAs(Name = "trackingrequest")]
[XmlRoot("trackingrequest")]
public class DpdTrackingRequest
{
//was [SerializeAs(Name = "user")]
[XmlElement("user")]
public string User { get; set; }
//was [SerializeAs(Name = "password")]
[XmlElement("password")]
public string Password { get; set; }
//was [SerializeAs(Name = "trackingnumbers")]
//from IList to List
[XmlArray("trackingnumbers")]
[XmlArrayItem("trackingnumber")]
public List<DpdTrackingNumber> TrackingNumbers { get; set; }
}
public class DpdTrackingNumber
{
[XmlText]
public string Value { get; set; }
}