【问题标题】:Newtonsoft.Json serialization returns empty json objectNewtonsoft.Json 序列化返回空的 json 对象
【发布时间】:2015-05-14 05:20:04
【问题描述】:

我有以下类的对象列表:

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

我得到以下结果。

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

请帮我解决这个问题。

【问题讨论】:

  • 您确定该列表不是空对象的列表吗?正如您已声明 Parameterzied 构造函数。如果要创建空对象,则必须在类中手动声明empty 构造函数。
  • 是的,列表中没有空对象
  • 我在使用 Jackson 库时遇到了同样的问题。公开这些字段也解决了那里的问题。
  • 没有公共属性也是我的问题。
  • 标记为内部的属性是一个类似的问题。见这篇文章的想法:stackoverflow.com/questions/26873755/…

标签: asp.net json json.net


【解决方案1】:

默认情况下,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;

【讨论】:

  • 类的公共成员不是最好的解决方案。是否存在其他更好的解决方案?
  • @IgnacioChiazzo 是的,您应该能够使用JsonPropertyAttribute 来指示应序列化非公共字段或属性:[JsonProperty]private int categoryId;
  • @JLRishe - 您应该添加您的评论作为答案,因为这是我现在的做法,而不是公开所有内容
  • @ChrisHammond 更新了我的答案。
  • 把我的头发拉了一个小时,想知道为什么这对一个班级不起作用,而对另一个班级起作用;忽略了我没有将我的属性声明为public
【解决方案2】:

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

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

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

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

【讨论】:

  • 它真的拯救了我的一天
  • 这个解决方案救了我。我以前从来没有这样做过,也不知道为什么我现在突然需要这样做......但我不会忘记它。
【解决方案3】:

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

【讨论】:

  • 类似的事情似乎发生在我身上,除了内部类(外部有 [DataContract],但内部没有)。相同的解决方案修复了它。
【解决方案4】:

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

在我的例子中,我是从 WCF 迁移到 web API,所以不需要任何 DataContract 或 DataMember,所以我删除了所有,它得到了很好的序列化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-16
    • 1970-01-01
    • 2020-06-17
    • 2021-12-30
    相关资源
    最近更新 更多