关于使用DataContractJsonSerializer(包括我的一个:How can I serialise a string array to JSON using DataContractJsonSerializer?)序列化和反序列化数组,有一些问题,但似乎没有人回答我目前遇到的问题。为什么使用DataContractJsonSerializer序列化后数组显示为空?
我将XML字符串反序列化为DataContract对象,然后使用DataContractJsonSerializer将该对象序列化为JSON,从而将XML字符串转换为JSON字符串。我的方法与我在许多其他对象上使用的方法相同,所有这些对象都完美地序列化为JSON,但我有一个对象,其中数组属性在序列化后总是呈现为空。
的类定义如下: -
[DataContract]
public class Order
{
[DataMember(Name = "consignments")]
[XmlElement("consignments")]
public Consignment[] Consignments { get; set; }
}
[DataContract]
public class Consignment
{
[DataMember(Name = "conh_id")]
[XmlElement("conh_id")]
public string ConsignmentHeaderId { get; set; }
[DataMember(Name = "conh_status")]
[XmlElement("conh_status")]
public string ConsignmentHeaderStatus { get; set; }
[DataMember(Name = "consignmententries")]
[XmlElement("consignmententries")]
public ConsignmentEntry[] ConsignmentEntries { get; set; }
}
的XML我使用看起来像这样: -
<order>
<consignments>
<consignment>
<conh_id>A19708176</conh_id>
<conh_status>ACCEPTED</conh_status>
<consignmententries>
<consignmententry>
<conl_lineNbr>10000</conl_lineNbr>
<conl_sku>SEC01XXZBUXXX</conl_sku>
<conl_original_qty>1</conl_original_qty>
</consignmententry>
</consignmententries>
</consignment>
</consignments>
</order>
的反序列化和序列化在以下方法进行: -
private object DeserialiseXml(string xml)
{
var serialiser = new XmlSerializer(typeof(Order));
var stringReader = new StringReader(xml);
var result = serialiser.Deserialize(stringReader);
return result;
}
private string SerialiseJson(object serialisable)
{
using (MemoryStream stream = new MemoryStream())
{
var serialiser = new DataContractJsonSerializer(serialisable.GetType());
serialiser.WriteObject(stream, serialisable);
var json = Encoding.UTF8.GetString(stream.ToArray());
return json;
}
}
当我测试它时,Consignments属性在结果JSON中始终为空。
"order": {
"consignments": [
{
"conh_id": null,
"conh_status": null,
"consignmententries": null
}
]
}
调试表明,这个属性是在反序列化步骤之后创建的对象无效,所以这个问题是在XML反序列化,而不是JSON序列。
我需要更改我的对象模型以正确地转换数组?
dbc,这是完美的工作。感谢您的答复。对于任何其他人,我遇到问题的原因是因为我的数组属性上有'[XMLElement]'属性。在其他对象模型中,我一直在序列化和反序列化XML元素名称已匹配对象属性,所以我不需要该属性。这将导致数组的处理与我预期的不同。 –