Newtonsoft.Json序列化返回空的json对象

时间:2015-03-12 06:29:36

标签: asp.net json json.net

我有以下类的对象列表:

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

我得到了以下结果。

  

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

请帮我解决这个问题。

4 个答案:

答案 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 枚举可让您指定要序列化的成员:

  • MemberSerialization.OptOut :所有公开成员都已序列化。
  • MemberSerialization.OptIn :只有标记有JsonPropertyAttribute或DataMemberAttribute的成员才会被序列化。
  • MemberSerialization.Fields :所有公共和私人成员都已序列化。

答案 2 :(得分:2)

此问题的另一个原因 - 我试图从一个基类,有[DataContract]属性派生序列化类,但派生类缺乏此属性。一旦我添加[DataContract]将派生类和[数据成员]到所有派生类的公共特性的它开始立即工作。

答案 3 :(得分:0)

在我看来,这是一个不同的问题, 如果您将一个类标记为[DataContract],则出现,则要序列化的属性需要标记为[DataMember],并且也应该是Public。

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