如何使用 DataContractJsonSerializer 将字符串数组序列化为 JSON?
How can I serialise a string array to JSON using DataContractJsonSerializer?
这似乎与下面的问题相同,但答案尚未解决:
Deserializing a Simple JSON Array
我正在使用 DataContractJsonSerializer 从 XML 转换为 JSON,反之亦然。一切都适用于复杂数据类型和复杂数据类型的数组,但我在为字符串数组生成 JSON 时遇到问题。
我需要制作的JSON应该是这样的结构:
{
"data": {
"x_axis": {
"labels": [ "Jan", "Feb", "Mar", "Apr","May", "Jun", "Jul", Aug","Sep", Oct", "Nov", "Dec" ]
}
}
}
我使用的对象是:-
折线图数据:
[DataContract]
public class LineChartData
{
[DataMember(Name = "x_axis")]
public LineChartXAxis XAxis { get; set; }
}
折线图X轴:
[DataContract]
public class LineChartXAxis
{
[DataMember(Name = "labels")]
public string[] Labels { get; set; }
}
我正在尝试转换的 XML 看起来像这样:
<LineChartData>
<XAxis>
<Labels>Jan</Labels>
<Labels>Feb</Labels>
<Labels>Mar</Labels>
<Labels>Apr</Labels>
<Labels>May</Labels>
<Labels>Jun</Labels>
<Labels>Jul</Labels>
<Labels>Aug</Labels>
<Labels>Sep</Labels>
<Labels>Oct</Labels>
<Labels>Nov</Labels>
<Labels>Dec</Labels>
</XAxis>
</LineChartData>
我的反序列化代码是:
var serialiser = new XmlSerializer(typeof(LineChartData));
var stringReader = new StringReader(xml);
var result = serialiser.Deserialize(stringReader);
我返回的JSON总是有一个空的标签数组:
{
"data": {
"x_axis": {
"labels":[]
}
}
}
我应该如何在 LineChartXAxis 中定义标签 属性 以正确序列化 JSON?
传统数组不容易调整大小,我认为这就是序列化程序出现问题的原因。将您的 Labels
属性 更改为 List<string>
应该可以。
你有几个问题:
您的 <Labels>
集合没有外部容器元素。默认情况下 XmlSerializer
在序列化集合时添加容器元素。要跳过外部包装元素,请将 [XmlElement("Labels")]
属性添加到 Labels
属性。 (XML serializer attributes and data contract attributes 相互独立,可以同时应用而不影响另一组。)
即您的实际问题是从 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<T>
{
[DataMember(Name = "data")]
public T Data { get; set; }
}
public static class RootObjectExtensions
{
public static RootObject<T> FromData<T>(T data)
{
return new RootObject<T> { Data = data };
}
}
然后像这样使用它们
var data = xmlString.LoadFromXML<LineChartData>();
var jsonString = DataContractJsonSerializerHelper.GetJson(RootObjectExtensions.FromData(data));
使用扩展方法:
public static class XmlSerializerHelper
{
public static T LoadFromXML<T>(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>(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, which has the ability to convert directly between JSON and XML。
这似乎与下面的问题相同,但答案尚未解决:
Deserializing a Simple JSON Array
我正在使用 DataContractJsonSerializer 从 XML 转换为 JSON,反之亦然。一切都适用于复杂数据类型和复杂数据类型的数组,但我在为字符串数组生成 JSON 时遇到问题。
我需要制作的JSON应该是这样的结构:
{
"data": {
"x_axis": {
"labels": [ "Jan", "Feb", "Mar", "Apr","May", "Jun", "Jul", Aug","Sep", Oct", "Nov", "Dec" ]
}
}
}
我使用的对象是:-
折线图数据:
[DataContract]
public class LineChartData
{
[DataMember(Name = "x_axis")]
public LineChartXAxis XAxis { get; set; }
}
折线图X轴:
[DataContract]
public class LineChartXAxis
{
[DataMember(Name = "labels")]
public string[] Labels { get; set; }
}
我正在尝试转换的 XML 看起来像这样:
<LineChartData>
<XAxis>
<Labels>Jan</Labels>
<Labels>Feb</Labels>
<Labels>Mar</Labels>
<Labels>Apr</Labels>
<Labels>May</Labels>
<Labels>Jun</Labels>
<Labels>Jul</Labels>
<Labels>Aug</Labels>
<Labels>Sep</Labels>
<Labels>Oct</Labels>
<Labels>Nov</Labels>
<Labels>Dec</Labels>
</XAxis>
</LineChartData>
我的反序列化代码是:
var serialiser = new XmlSerializer(typeof(LineChartData));
var stringReader = new StringReader(xml);
var result = serialiser.Deserialize(stringReader);
我返回的JSON总是有一个空的标签数组:
{
"data": {
"x_axis": {
"labels":[]
}
}
}
我应该如何在 LineChartXAxis 中定义标签 属性 以正确序列化 JSON?
传统数组不容易调整大小,我认为这就是序列化程序出现问题的原因。将您的 Labels
属性 更改为 List<string>
应该可以。
你有几个问题:
您的
<Labels>
集合没有外部容器元素。默认情况下XmlSerializer
在序列化集合时添加容器元素。要跳过外部包装元素,请将[XmlElement("Labels")]
属性添加到Labels
属性。 (XML serializer attributes and data contract attributes 相互独立,可以同时应用而不影响另一组。)即您的实际问题是从 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<T>
{
[DataMember(Name = "data")]
public T Data { get; set; }
}
public static class RootObjectExtensions
{
public static RootObject<T> FromData<T>(T data)
{
return new RootObject<T> { Data = data };
}
}
然后像这样使用它们
var data = xmlString.LoadFromXML<LineChartData>();
var jsonString = DataContractJsonSerializerHelper.GetJson(RootObjectExtensions.FromData(data));
使用扩展方法:
public static class XmlSerializerHelper
{
public static T LoadFromXML<T>(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>(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, which has the ability to convert directly between JSON and XML。