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,所以我删除了所有并且它得到了很好的序列化。