我有一个继承自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>
答案 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
的示例:
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; }
}