asp.net-Newtonsoft.Json序列化返回空的json obj

我有以下类别的对象的列表:

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);

我得到以下结果。

[{},{},{},{},{}]

关于这个问题,请帮助我。

VIVEK asked 2020-08-09T13:40:59Z
4个解决方案
91 votes

默认情况下,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;
JLRishe answered 2020-08-09T13:41:09Z
11 votes

您也可以修饰类以序列化所需的所有成员,而不必为每个成员指定[JsonProperty]。

[JsonObject(MemberSerialization.OptOut)]
public class Catagory {
    ...
}

MemberSerialization枚举允许您指定要序列化的成员:

  • MemberSerialization.OptOut:所有公共成员都已序列化。
  • MemberSerialization.OptIn:仅将标记有JsonPropertyAttribute或DataMemberAttribute的成员序列化。
  • MemberSerialization.Fields:所有公共和私有成员都已序列化。
joalcego answered 2020-08-09T13:41:47Z
5 votes

造成此问题的另一个原因-我正在尝试序列化的类是从具有[DataContract]属性的基类派生的,但是派生类缺少此属性。 将[DataContract]添加到派生类中并将[DataMember]添加到派生类的所有公共属性后,它立即开始工作。

Tom Regan answered 2020-08-09T13:42:07Z
0 votes

就我而言,另一个问题是如果将一个类标记为[DataContract],则会出现,则需要序列化的属性需要标记为[DataMember],并且还应该为Public。

就我而言,我是从WCF迁移到Web API的,因此不需要任何DataContract或DataMember,因此我删除了所有内容并对其进行了序列化。

Manish Basantani answered 2020-08-09T13:42:32Z
translate from https://stackoverflow.com:/questions/29003215/newtonsoft-json-serialization-returns-empty-json-object