web-dev-qa-db-fra.com

La sérialisation Newtonsoft.Json renvoie un objet json vide

J'ai une liste d'objets de classe suivante:

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

lorsque je convertis cette liste en chaîne json à l'aide de Newtonsoft.Json, elle retourne un tableau d'objets vides.

  string json=JsonConvert.SerializeObject(list);

Je reçois le résultat suivant.

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

S'il vous plaît aidez-moi en ce qui concerne ce problème.

26
VIVEK

Par défaut, NewtonSoft.Json ne sérialisera que les membres publics. Rendez donc vos champs publics:

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: Si pour une raison quelconque vous ne voulez vraiment pas rendre vos champs publics, vous pouvez les décorer avec le JsonPropertyAttribute pour leur permettre d'être sérialisés et désérialisés:

[JsonProperty]
int catagoryId;
67
JLRishe

Vous pouvez également décorer votre classe pour sérialiser tous les membres de votre choix sans avoir à spécifier [JsonProperty] pour chacun d'eux.

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

Le MemberSerialization enum vous permet de spécifier les membres que vous souhaitez sérialiser:

  • MemberSerialization.OptOut : Tous les membres publics sont sérialisés.
  • MemberSerialization.OptIn : Seuls les membres marqués avec JsonPropertyAttribute ou DataMemberAttribute sont sérialisés.
  • MemberSerialization.Fields : Tous les membres publics et privés sont sérialisés.
8
joalcego

Une autre cause de ce problème - la classe que j'essayais de sérialiser dérive d'une classe de base ayant l'attribut [DataContract], mais cet attribut manquait à la classe dérivée. Une fois que j'ai ajouté [DataContract] à la classe dérivée et [DataMember] à toutes les propriétés publiques de la classe dérivée, il a immédiatement commencé à fonctionner.

0
Tom Regan