2016-08-23 89 views
1

繼承我有一個從List<T>繼承的類,並添加更多的類屬性JSON序列化與類從列表<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屬性添加到結果?

解決:加入這個屬性是您使用的.NET版本列表

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

JSON哪些您使用的是串行器,是json.net? –

+0

即時通訊使用Newtonsoft.Json –

+0

您究竟如何試圖反序列化JSON字符串?您是否在使用泛型超載? –

回答

1

據我所知,與Newtonsoft所有你能做的就是這樣的事情:

[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; } 
} 
+0

非常感謝Loana!添加JsonObjectAttribute解決了我的問題 –

0

,什麼串? 如果您正在使用標準串行器,那麼添加[DataMember]註釋將是答案。
https://msdn.microsoft.com/en-us/library/bb412179(v=vs.110).aspx

不過,我會建議使用Json.NET http://www.newtonsoft.com/json

更新:

我建議不要直接繼承列出

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; } 
} 

輸出:

{"Items":[1,2],"Name":"Ragnarok"} 
+0

即時通訊使用Newtonsoft.Json ,. net FW 4.5 –

+0

更新了我的答案。 :) – Fritz

+0

謝謝,但我不能改變這個類 –

0

DataContract屬性應用於屬性,DataMember屬性應用於屬性。

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

    private DrivenList() { } 

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

這是行不通的。 –

+0

謝謝@AlekseyL :)。 ...有任何想法如何可能工作? –

+0

你需要一個自定義的'JsonConverter'來完成這個工作,因爲NewtonSoft簡單地將'DrivenList'作爲一個'IEnumerable'對待並將它呈現爲一個數組。 – smoksnes

1

另一種解決方案可能是的IList實施委託給自己的財產。然後你可以使用DataContractSerializer。這樣做的好處是,所有現有的C#代碼(以及所有的測試)仍然完好無損,並且不需要自定義邏輯來序列化它。

如果這不是一個選項,你真的想使用牛頓軟件,那麼你應該看看這個答案,並創建自己的JsonConverter

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

的問題是以下內容:當一個對象實現IEnumerable, JSON。淨標識爲值數組和序列化它 陣列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"} 
+0

謹慎地闡述downvote?這個例子有效,最初的OP沒有提到NewtonSoft作爲一項要求。 – smoksnes