如何使用DataContractJsonSerializer将字符串数组序列化为JSON?

这似乎与下面的问题相同,但答案尚未解决:

反序列化一个简单的JSON数组

我正在使用DataContractJsonSerializer将XML转换为JSON,反之亦然。 一切都适用于复杂的数据类型和复杂数据类型的数组,但我遇到了为字符串数组生成JSON的问题。

我需要生成的JSON应该具有以下结构:

{ "data": { "x_axis": { "labels": [ "Jan", "Feb", "Mar", "Apr","May", "Jun", "Jul", Aug","Sep", Oct", "Nov", "Dec" ] } } } 

我使用的对象是: –

LineChartData:

 [DataContract] public class LineChartData { [DataMember(Name = "x_axis")] public LineChartXAxis XAxis { get; set; } } 

LineChartXAxis:

 [DataContract] public class LineChartXAxis { [DataMember(Name = "labels")] public string[] Labels { get; set; } } 

我试图转换的XML看起来像这样:

   Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec   

我的反序列化代码是:

 var serialiser = new XmlSerializer(typeof(LineChartData)); var stringReader = new StringReader(xml); var result = serialiser.Deserialize(stringReader); 

我回来的JSON总是有一个空标签数组:

 { "data": { "x_axis": { "labels":[] } } } 

我应该如何在LineChartXAxis中定义Labels属性以正确地序列化JSON?

你有几个问题:

  1. 您的集合没有外部容器元素。 默认情况下, XmlSerializer在序列化集合时添加容器元素。 要跳过外部包装元素,请在Labels属性中添加[XmlElement("Labels")]属性。 ( XML序列化程序属性和数据协定属性是相互独立的,并且可以在没有一个集合影响另一个的情况下应用它们。)

    即你的实际问题是从XML中读取你的字符串列表而不是写入JSON。

  2. 您的JSON具有与{"data": {...}}对象相对应的外部根元素。 序列化时需要考虑到这一点。 (也许你这样做,但没有显示。)

因此以下应该有效:

 [DataContract] public class LineChartData { [DataMember(Name = "x_axis")] public LineChartXAxis XAxis { get; set; } } [DataContract] public class LineChartXAxis { [DataMember(Name = "labels")] [XmlElement("Labels")] public string[] Labels { get; set; } } [DataContract] public class RootObject { [DataMember(Name = "data")] public T Data { get; set; } } public static class RootObjectExtensions { public static RootObject FromData(T data) { return new RootObject { Data = data }; } } 

然后像他们一样使用它们

  var data = xmlString.LoadFromXML(); var jsonString = DataContractJsonSerializerHelper.GetJson(RootObjectExtensions.FromData(data)); 

使用扩展方法:

 public static class XmlSerializerHelper { public static T LoadFromXML(this string xmlString, XmlSerializer serial = null) { using (StringReader reader = new StringReader(xmlString)) { object result = (serial ?? new XmlSerializer(typeof(T))).Deserialize(reader); if (result is T) return (T)result; } return default(T); } } public static class DataContractJsonSerializerHelper { public static string GetJson(T obj, DataContractJsonSerializer serializer = null) { using (var memory = new MemoryStream()) { (serializer ?? new DataContractJsonSerializer(typeof(T))).WriteObject(memory, obj); memory.Seek(0, SeekOrigin.Begin); using (var reader = new StreamReader(memory)) { return reader.ReadToEnd(); } } } } 

顺便提一下,作为替代方案,您可以查看Json.NET ,它能够直接在JSON和XML之间进行转换 。

传统arrays不容易resize,我认为这就是串行器出现问题的原因。 将您的Labels属性更改为List ,这应该有效。