簡體   English   中英

如何使用DataContractJsonSerializer將字符串數組序列化為JSON?

[英]How can I serialise a string array to JSON using DataContractJsonSerializer?

這似乎是與下面相同的問題,但該答案尚未解決:

反序列化一個簡單的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如下所示:

<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中定義Labels屬性以正確地序列化JSON?

您在這里遇到幾個問題:

  1. 您的<Labels>集合沒有外部容器元素。 默認情況下, XmlSerializer在序列化集合時添加一個容器元素。 要跳過外部包裝器元素,請將[XmlElement("Labels")]屬性添加到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<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 ,它具有直接在JSON和XML之間轉換的功能。

傳統的數組不容易調整大小,我認為這就是串行器出現問題的原因。 將您的Labels屬性更改為List<string> ,這應該可以工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM