Подтвердить что ты не робот

Сериализация 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;
    }
}

когда я конвертирую этот список в строку json с помощью Newtonsoft.Json, он возвращает массив пустых объектов.

  string json=JsonConvert.SerializeObject(list);

Я получаю следующий результат.

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

Пожалуйста, помогите мне в решении этой проблемы.

4b9b3361

Ответ 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;

Ответ 2

Вы также можете украсить свой класс, чтобы сериализовать всех членов, которых вы хотите, без указания [JsonProperty] для каждого из них.

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

В перечислении MemberSerialization вы можете указать, какие члены вы хотите сериализовать:

  • MemberSerialization.OptOut: все публичные члены сериализованы.
  • MemberSerialization.OptIn: только члены, помеченные JsonPropertyAttribute или DataMemberAttribute, сериализуются.
  • MemberSerialization.Fields: все публичные и частные члены сериализованы.

Ответ 3

Другая причина этой проблемы - класс, который я пытался сериализовать, производный от базового класса, который имел атрибут [DataContract], но производному классу не хватало этого атрибута. Как только я добавил [DataContract] к производному классу и [DataMember] ко всем открытым свойствам производного класса, он сразу начал работать.