Как десериализовать массив JSON в список с помощью System.Runtime.Serialization.Json - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь десериализовать файл JSON, но по какой-то причине я просто не могу заставить его работать. Это правильный способ десериализации массива JSON в список.

Это данные JSON, которые я хотел бы десериализовать и поместить в объект курсовой работы

{ 
   "assignments":[ 
      { 
         "categoryname":"Exams",
         "description":"Test covers C#, classes and other topics",
         "name":"Exam 1"
      },
      { 
         "categoryname":"Exams",
         "description":"Test covers collections and other topics",
         "name":"Exam 2"
      },

Используемый мной метод десериализации

            List<T> ReadJsonFile1<T>(List<T> obj)
            {
                Console.Write("Enter Json File Name: ");
                string fileName = Console.ReadLine();
                FileStream reader = new FileStream(fileName, FileMode.Open, FileAccess.Read);

                DataContractJsonSerializer deser;
                deser = new DataContractJsonSerializer(typeof(List<T>));

                obj = (List<T>)deser.ReadObject(reader);

                reader.Close();
                return obj;
            }

Код, который я выполняю в Main

            CourseWork cw = new CourseWork();

            cw.Assignment = ReadJsonFile1<Assignment>(cw.Assignment);

CourseWork Class

public class CourseWork
    {
        private List<Assignment> assignments;

        [DataMember(Name = "assignmentname")]
        public List<Assignment> Assignment
        {
            get { return assignments; }
            set { assignments = value; }
        }

        public CourseWork()
        {
            assignments = new List<Assignment>();
        }

Класс назначения

        private string name;
        private string description;
        private string categoryName;

        //DataContract
        [DataMember(Name = "name")]
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        //DataContract
        [DataMember(Name = "description")]
        public string Description 
        {
            get { return description; }
            set { description = value; }
        }

        //DataContract
        [DataMember(Name = "categoryname")]
        public string CategoryName
        {
            get { return categoryName; }
            set { categoryName = value; }
        }

        public Assignment()
        {
            name = "defaut";
            description = "defaut";
            categoryName = "defaut";
        }

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Что я не учел, так это того, что CourseWork - это не список, а просто списки внутри него как частные переменные-члены. Чтобы исправить мою проблему, мне пришлось изменить мою List<T> ReadJsonFile1<T>(List<T> obj) функцию обратно на ту, которая была у меня ранее в проекте T ReadJsonFile1<T>(T obj) По сути, просто вынуть все списки и сделать их обычным типом T. Мне также нужно было добавить имена DataContract в ALLмои занятия. Мои DataMembers были в порядке, но так как это массив Json, мне нужно было добавить DataContract над каждым классом, как в классе Assignment , а также в классе CourseWork, просто нужно убедиться, что вы указали в своем DataContract правильное имя.

РЕШЕНИЕ

List<T> ReadJsonFile1<T>(List<T> obj)
 [DataContract(Name = "coursename")]
  public class CourseWork
  {
[DataContract(Name = "assignments")]
    public class Assignment
     {
1 голос
/ 19 октября 2019

1

Я плохо знаю этот десериализатор, но

deser = new DataContractJsonSerializer(typeof(List<T>));

Вероятно, что-то вроде

deser = new DataContractJsonSerializer(typeof(CourseWork));

2

  [DataMember(Name = "assignmentname")]
        public List<Assignment> Assignment

вполне вероятно должно быть

  [DataMember(Name = "assignments")]
        public List<Assignment> Assignment
        {
...