如何使用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?
你有几个问题:
-
您的
集合没有外部容器元素。 默认情况下,XmlSerializer
在序列化集合时添加容器元素。 要跳过外部包装元素,请在Labels
属性中添加[XmlElement("Labels")]
属性。 ( XML序列化程序属性和数据协定属性是相互独立的,并且可以在没有一个集合影响另一个的情况下应用它们。)即你的实际问题是从XML中读取你的字符串列表而不是写入JSON。
-
您的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
,这应该有效。