2015-11-18 50 views
0

关于使用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序列。

我需要更改我的对象模型以正确地转换数组?

回答

1

当您从XML反序列化而不是序列化为JSON时,会出现问题。在你的XML,藏品已系列化有两个层面:外部容器元素,并为每个项目的元素:

<consignments> 
    <consignment> 
     <!-- Consignment data --> 
    </consignment> 
    </consignments> 

而且

<consignmententries> 
    <consignmententry> 
     <!-- Entry data --> 
    </consignmententry> 
    </consignmententries> 

(为便于比较,在linked questionLabels XML集合有一个单一的级别)。因此,你需要使用[XmlArray(string name)][XmlArrayItem(string itemName)]指定外部和内部元素名称:

[DataContract] 
[XmlRoot("order")] 
public class Order 
{ 
    [DataMember(Name = "consignments")] 
    [XmlArray("consignments")] 
    [XmlArrayItem("consignment")] 
    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")] 
    [XmlArray("consignmententries")] 
    [XmlArrayItem("consignmententry")] 
    public ConsignmentEntry[] ConsignmentEntries { get; set; } 
} 

相反,添加属性[XmlElement]到集合告诉XmlSerializer该集合应在没有外部容器元素序列化。

您还需要将[XmlRoot("order")]添加到Order以指定根元素名称。

现在您的XML将成功反序列化。

+0

dbc,这是完美的工作。感谢您的答复。对于任何其他人,我遇到问题的原因是因为我的数组属性上有'[XMLElement]'属性。在其他对象模型中,我一直在序列化和反序列化XML元素名称已匹配对象属性,所以我不需要该属性。这将导致数组的处理与我预期的不同。 –

相关问题