JSON序列化在派生类中缺少属性
本文关键字:属性 序列化 派生 JSON | 更新日期: 2023-09-27 18:22:07
我使用的是Newtonsoft JSON序列化程序,如果派生类是从列表派生的,则序列化字符串缺少派生类的属性。这是我的示例代码。
类别:
[DataContract]
public class TestItem
{
[DataMember]
public int itemInt;
[DataMember]
public string itemString;
public TestItem() {}
public TestItem(int _intVal, string _stringVal)
{
itemInt = _intVal;
itemString = _stringVal;
}
}
[DataContract]
public class TestMain : List<TestItem>
{
[DataMember]
public int mainInt;
[DataMember]
public string mainString;
}
序列化代码:
string test;
// Test classes
TestMain main = new TestMain();
main.mainInt = 123;
main.mainString = "Hello";
main.Add(new TestItem(1, "First"));
test = Newtonsoft.Json.JsonConvert.SerializeObject(main);
序列化后,测试的值为:
[{''"itemInt":1,''"itemString''":''"First''"}]
mainInt和mainString的值完全丢失。
[DataContract]和[DataMember]标签不会改变行为,但我在那里有它们,以预先确定它们缺失的答案。
如何让JSON识别并序列化派生类的mainInt和mainString属性?
看看如何在属性上放置json属性。下面是一个示例:Json.NET使用根名称序列化对象。我唯一不愿意做的就是让main从列表中派生出来。这不是推荐的模式和做法。添加list作为另一个子属性,而不是从list派生,json序列化会混淆您的意图。
这就是您想要的吗?
[DataContract]
public class TestItem
{
[DataMember]
public int itemInt { get; set; }
[DataMember]
public string itemString { get; set; }
public TestItem() { }
public TestItem(int _intVal, string _stringVal)
{
itemInt = _intVal;
itemString = _stringVal;
}
}
[DataContract]
public class TestMain
{
[DataMember]
public int mainInt { get; set; }
[DataMember]
public string mainString { get; set; }
[DataMember]
public List<TestItem> TestItem = new List<TestItem>();
}
class Program
{
static void Main(string[] args)
{
string test;
// Test classes
TestMain main = new TestMain();
main.mainInt = 123;
main.mainString = "Hello";
main.TestItem.Add(new TestItem(1, "First"));
test = Newtonsoft.Json.JsonConvert.SerializeObject(main);
Console.WriteLine(test);
}
}
添加此属性对我有效:
使用System.ComponentModel.DataAnnotations;
[Newtonsoft.Json.JsonObject(Title="root")]公共类Testmain:列出