我有以下类的对象列表:
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);
我得到以下结果。
[{},{},{},{},{}]
请帮助我解决这个问题。
默认情况下,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 修饰它们,以允许它们被序列化和反序列化:
[JsonProperty]
int catagoryId;
此属性还允许指定其他选项,例如指定序列化/反序列化时要使用的属性名称:
[JsonProperty("categoryId")]
int Category;
您还可以装饰类以序列化所需的所有成员,而无需为每个成员指定 [JsonProperty]。
[JsonObject(MemberSerialization.OptOut)]
public class Catagory {
...
}
成员序列化枚举允许您指定要序列化的成员:
- MemberSerialization.OptOut:所有公共成员都已序列化。
- MemberSerialization.OptIn:只有标有 JsonPropertyAttribute 或 DataMemberAttribute 的成员才会被序列化。
- MemberSerialization.Fields:所有公共和私有成员都已序列化。
此问题的另一个原因 - 我尝试序列化的类派生自具有 [DataContract]
属性的基类,但派生类缺少此属性。 一旦我[DataContract]
添加到派生类并[DataMember]
派生类的所有公共属性,它就会立即开始工作。
在我的情况下是一个不同的问题,如果将类标记为[DataContract]
则会出现要序列化的属性需要标记为[DataMember]
并且也应为公共。
就我而言,我正在从WCF迁移到Web API,因此不需要任何DataContract或DataMember,因此我删除了所有内容,并且它得到了很好的序列化。