我有以下类的对象列表:
public class Catagory
{
int catagoryId;
string catagoryNameHindi;
string catagoryNameEnglish;
List<Object> subCatagories;
public Catagory(int Id, string NameHindi, string NameEng,List<Object> l)
{
this.catagoryId = Id;
this.catagoryNameHindi = NameHindi;
this.catagoryNameEnglish = NameEng;
this.subCatagories = l;
}
}
public class SubCatagory
{
int subCatagoryId { get; set; }
string subCatNameHindi { get; set; }
string subCatNameEng { get; set; }
public SubCatagory(int Id, string NameHindi, string NameEng)
{
this.subCatagoryId = Id;
this.subCatNameEng = NameEng;
this.subCatNameHindi = NameHindi;
}
}
当我使用Newtonsoft.Json将此列表转换为json字符串时,它返回空对象数组。
string json=JsonConvert.SerializeObject(list);
我得到了以下结果。
[{},{},{},{},{}]
请帮我解决这个问题。
答案 0 :(得分:80)
默认情况下,NewtonSoft.Json只会序列化公共成员,因此请将您的字段公开:
public class Catagory
{
public int catagoryId;
public string catagoryNameHindi;
public string catagoryNameEnglish;
public List<Object> subCatagories;
public Catagory(int Id, string NameHindi, string NameEng, List<Object> l)
{
this.catagoryId = Id;
this.catagoryNameHindi = NameHindi;
this.catagoryNameEnglish = NameEng;
this.subCatagories = l;
}
}
编辑:如果由于某种原因您真的不想公开您的字段,您可以使用JsonPropertyAttribute来装饰它们,以允许它们被序列化和反序列化:< / p>
[JsonProperty]
int catagoryId;
答案 1 :(得分:9)
你也可以装饰你的类来序列化你想要的所有成员,而不必为每个成员指定[JsonProperty]。
[JsonObject(MemberSerialization.OptOut)]
public class Catagory {
...
}
MemberSerialization 枚举可让您指定要序列化的成员:
答案 2 :(得分:2)
此问题的另一个原因 - 我试图从一个基类,有[DataContract]属性派生序列化类,但派生类缺乏此属性。一旦我添加[DataContract]将派生类和[数据成员]到所有派生类的公共特性的它开始立即工作。
答案 3 :(得分:0)
在我看来,这是一个不同的问题,
如果您将一个类标记为[DataContract]
,则出现,则要序列化的属性需要标记为[DataMember]
,并且也应该是Public。
就我而言,我是从WCF迁移到Web API的,因此不需要任何DataContract或DataMember,因此我删除了所有内容并对其进行了序列化。