Newtonsoft.Json序列化returns空json对象
Newtonsoft.Json serialization returns empty json object
我有以下对象列表 class:
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 字符串时 returns 空对象数组。
string json=JsonConvert.SerializeObject(list);
我得到以下结果。
[{},{},{},{},{}]
请帮我解决这个问题。
默认情况下,NewtonSoft.Json 只会序列化 public 个成员,因此请将您的字段设置为 public:
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;
}
}
如果出于某种原因你真的不想让你的字段 public,你可以用 JsonPropertyAttribute 装饰它们以允许它们被序列化和反序列化:
[JsonProperty]
int catagoryId;
此属性还允许指定其他选项,例如指定在 serializing/deserializing:
时使用的 属性 名称
[JsonProperty("categoryId")]
int Category;
您还可以修饰 class 以序列化您想要的所有成员,而不必为每个成员指定 [JsonProperty]。
[JsonObject(MemberSerialization.OptOut)]
public class Catagory {
...
}
MemberSerialization 枚举允许您指定要序列化的成员:
- MemberSerialization.OptOut: 所有public成员已连载。
- MemberSerialization.OptIn: 只有标有JsonPropertyAttribute 或DataMemberAttribute 的成员才被序列化。
- MemberSerialization.Fields: 所有public和私有成员都被序列化。
此问题的另一个原因——class 我试图序列化派生自具有 [DataContract]
属性的基 class,但是派生的 class缺少这个属性。一旦我将 [DataContract]
添加到派生 class 并将 [DataMember]
添加到派生 class 的所有 public 属性,它立即开始工作。
我的情况不同,
如果您将 class 标记为 [DataContract]
,则显示要序列化的属性需要标记为 [DataMember]
并且还应为 Public.
在我的例子中,我正在从 WCF 迁移到 Web API,所以不需要任何 DataContract 或 DataMember,所以我删除了所有并且它得到了很好的序列化。
我有以下对象列表 class:
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 字符串时 returns 空对象数组。
string json=JsonConvert.SerializeObject(list);
我得到以下结果。
[{},{},{},{},{}]
请帮我解决这个问题。
默认情况下,NewtonSoft.Json 只会序列化 public 个成员,因此请将您的字段设置为 public:
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;
}
}
如果出于某种原因你真的不想让你的字段 public,你可以用 JsonPropertyAttribute 装饰它们以允许它们被序列化和反序列化:
[JsonProperty]
int catagoryId;
此属性还允许指定其他选项,例如指定在 serializing/deserializing:
时使用的 属性 名称[JsonProperty("categoryId")]
int Category;
您还可以修饰 class 以序列化您想要的所有成员,而不必为每个成员指定 [JsonProperty]。
[JsonObject(MemberSerialization.OptOut)]
public class Catagory {
...
}
MemberSerialization 枚举允许您指定要序列化的成员:
- MemberSerialization.OptOut: 所有public成员已连载。
- MemberSerialization.OptIn: 只有标有JsonPropertyAttribute 或DataMemberAttribute 的成员才被序列化。
- MemberSerialization.Fields: 所有public和私有成员都被序列化。
此问题的另一个原因——class 我试图序列化派生自具有 [DataContract]
属性的基 class,但是派生的 class缺少这个属性。一旦我将 [DataContract]
添加到派生 class 并将 [DataMember]
添加到派生 class 的所有 public 属性,它立即开始工作。
我的情况不同,
如果您将 class 标记为 [DataContract]
,则显示要序列化的属性需要标记为 [DataMember]
并且还应为 Public.
在我的例子中,我正在从 WCF 迁移到 Web API,所以不需要任何 DataContract 或 DataMember,所以我删除了所有并且它得到了很好的序列化。