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

VIV*_*VEK 44 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我通过使用Newtonsoft.Json将此列表转换为json字符串时,它返回空对象的数组.

  string json=JsonConvert.SerializeObject(list);
Run Code Online (Sandbox Code Playgroud)

我得到了以下结果.

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

请帮我解决这个问题.

JLR*_*she 93

默认情况下,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;
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果由于某种原因你真的不想让你的字段公开,你可以用JsonPropertyAttribute来装饰它们,以允许它们被序列化和反序列化:

[JsonProperty]
int catagoryId;
Run Code Online (Sandbox Code Playgroud)

  • @IgnacioChiazzo 是的,您应该能够使用 [`JsonPropertyAttribute`](http://www.newtonsoft.com/json/help/html/SerializationAttributes.htm) 来指示应序列化非公共字段或属性:`[JsonProperty]private int categoryId;` (12认同)
  • 该类的公共成员不是最佳解决方案.是否存在其他更好的解决方案? (3认同)

joa*_*ego 11

您还可以修饰您的类以序列化您想要的所有成员,而无需为每个成员指定[JsonProperty].

[JsonObject(MemberSerialization.OptOut)]
public class Catagory {
    ...
}
Run Code Online (Sandbox Code Playgroud)

MemberSerialization枚举允许你指定要序列什么成员:

  • MemberSerialization.OptOut:所有公共成员都被序列化.
  • MemberSerialization.OptIn:仅序列化标记有JsonPropertyAttribute或DataMemberAttribute的成员.
  • MemberSerialization.Fields:所有公共和私有成员都被序列化.


Man*_*ani 6

在我的情况下,一个不同的问题是,如果您将类标记为,[DataContract]则需要标记要序列化的属性[DataMember]并且也应该是公共的。

就我而言,我正在从 WCF 迁移到 Web API,因此不需要任何 DataContract 或 DataMember,所以我删除了所有内容并且序列化得很好。


Tom*_*gan 5

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

  • 除了内部类(外部有[DataContract],而内部没有[DataContract]),我似乎也发生了类似的事情。相同的解决方案将其修复。 (2认同)