继承自List <t>的类的JSON序列化

时间:2016-08-23 04:55:14

标签: c# json

我有一个继承自List<T>的类,并再添加一个类属性

public class DrivenList : List<int>
{
    public string Name {get;set;}

    private DrivenList() { }

    public DrivenList(string name) { this.Nname = name; }
}

当JSON使用Newtonsoft.Json序列化对象时,我只得到列表项。 ([1,2,3])

如何将Name属性添加到结果中?

解决:将此属性添加到列表

[JsonObject(MemberSerialization = MemberSerialization.Fields)]
public class DrivenList : List<int>

4 个答案:

答案 0 :(得分:1)

据我所知,与牛顿软件有关的所有事情都是这样的:

[JsonObject(MemberSerialization = MemberSerialization.Fields)]
public class DrivenList : List<int>
{

    [JsonProperty]
    public string Name { get; set; }

    private DrivenList() { }

    public DrivenList(string name) { this.Name = name; }
}

但这会为你添加不需要的(可能)字段。

我个人会做作文而不是继承:

public class DrivenList
{
    public string Name { get; set; }

    public List<int> Items { get; set; }

    private DrivenList() { }

    public DrivenList(string name) { this.Name = name; }
}

答案 1 :(得分:1)

另一种解决方案可能是将IList的实施委托给您自己的财产。然后,您可以使用DataContractSerializer。这样做的好处是所有现有的C#代码(以及所有测试)仍然完好无损,并且不需要自定义逻辑来序列化它。

如果这不是一个选项,你真的想使用NewtonSoft,那么你应该看看这个答案,并创建你自己的JsonConverter

How to serialize/deserialize a custom collection with additional properties using Json.Net

  

问题如下:当一个对象实现IEnumerable时,   JSON.net将其标识为值数组并将其序列化   在数组Json syntax之后(不包含属性)

以下是使用DataContractSerializer的示例:

JsonHelper from CodeProject

public class JsonHelper
{
    /// <summary>
    /// JSON Serialization
    /// </summary>
    public static string JsonSerializer<T>(T t)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream();
        ser.WriteObject(ms, t);
        string jsonString = Encoding.UTF8.GetString(ms.ToArray());
        ms.Close();
        return jsonString;
    }

    /// <summary>
    /// JSON Deserialization
    /// </summary>
    public static T JsonDeserialize<T>(string jsonString)
    {
        DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T));
        MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        T obj = (T)ser.ReadObject(ms);
        return obj;
    }
}

你班级的新实施。

[DataContract]
public class DrivenList : IList<int>
{

    [DataMember]
    public List<int> Items = new List<int>();

    [DataMember]
    public string Name { get; set; }

    private DrivenList() { }

    public DrivenList(string name) { this.Name = name; }


    #region Implementation of IList

    public IEnumerator<int> GetEnumerator()
    {
        return Items.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return ((IEnumerable)Items).GetEnumerator();
    }

    public void Add(int item)
    {
        Items.Add(item);
    }

    public void Clear()
    {
        Items.Clear();
    }

    public bool Contains(int item)
    {
        return Items.Contains(item);
    }

    public void CopyTo(int[] array, int arrayIndex)
    {
        Items.CopyTo(array, arrayIndex);
    }

    public bool Remove(int item)
    {
        return Items.Remove(item);
    }

    public int Count
    {
        get { return Items.Count; }
    }

    public bool IsReadOnly
    {
        get { return false; }
    }

    public int IndexOf(int item)
    {
        return Items.IndexOf(item);
    }

    public void Insert(int index, int item)
    {
        Items.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        Items.RemoveAt(index);
    }

    public int this[int index]
    {
        get { return Items[index]; }
        set { Items[index] = value; }
    }

    #endregion
}

一个示例用法:

var list = new DrivenList("foo");
list.Add(1);
list.Add(3);
list.Add(5);

var json = JsonHelper.JsonSerializer(list);

输出:

{"Items":[1,3,5],"Name":"foo"}

答案 2 :(得分:0)

您使用的是什么.NET版本以及什么序列化程序? 如果您使用的是标准序列化程序,那么添加hours = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']; 注释就是答案 https://msdn.microsoft.com/en-us/library/bb412179(v=vs.110).aspx

但我建议使用Json.NET http://www.newtonsoft.com/json

更新

我建议不要直接继承List

[DataMember]

输出:

class Program
{
    static void Main(string[] args)
    {
        var list = new Driven("Ragnarok");
        list.Items.Add(1);
        list.Items.Add(2);

        string json = JsonConvert.SerializeObject(list);
        Console.WriteLine(json);
        Console.ReadKey();
    }
}

public class Driven
{
    public Driven(string name)
    {
        this.Name = name;
    }
    public List<int> Items { get; set; } = new List<int>();
    public string Name { get; set; }
}

答案 3 :(得分:0)

应用属性的DataContract属性和属性的DataMember属性。

[DataContract]
public class DrivenList : List<int>
{
    [DataMember]
    public string Name {get;set;}

    private DrivenList() { }

    public DrivenList(string name) { this.Nname = name; }
}