web-dev-qa-db-ja.com

Newtonsoft.Jsonシリアル化は空のjsonオブジェクトを返します

次のクラスのオブジェクトのリストがあります。

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

私は次の結果を得ています。

[{}、{}、{}、{}、{}]

この問題に関して私を助けてください。

40
VIVEK

デフォルトでは、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;
    }
}

Edit:何らかの理由でフィールドを公開したくない場合は、代わりに JsonPropertyAttribute =それらを直列化および非直列化できるようにするため:

[JsonProperty]
int catagoryId;
87
JLRishe

また、クラスごとに[JsonProperty]を指定しなくても、必要なすべてのメンバーをシリアル化するようにクラスを装飾できます。

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

MemberSerialization enumを使用すると、シリアル化するメンバーを指定できます。

  • MemberSerialization.OptOut:すべてのパブリックメンバーがシリアル化されます。
  • MemberSerialization.OptIn:JsonPropertyAttributeまたはDataMemberAttributeでマークされたメンバーのみがシリアル化されます。
  • MemberSerialization.Fields:すべてのパブリックおよびプライベートメンバーがシリアル化されます。
11
joalcego

この問題の別の原因-[DataContract]属性を持つ基本クラスから派生したクラスをシリアル化しようとしましたが、派生クラスにはこの属性がありませんでした。 [DataContract]を派生クラスに、[DataMember]を派生クラスのすべてのパブリックプロパティに追加すると、すぐに機能し始めました。

5
Tom Regan