Динамическая структура классов, в которой проводятся мероприятия на каждый день месяца - PullRequest
0 голосов
/ 28 февраля 2019

Я должен представить JSON как структуру класса, чтобы я мог использовать его для возврата этого класса в конечные точки ядра asp.net.Мне нужно вернуть объект, содержащий каждый день текущего месяца и для каждого дня содержит массив событий.

Вот JSON, где числа являются днем ​​месяца.

[
  {
    "1":[
      {
        "Title":"Meeting",
        "DateTime":"12:40"
      },
      {
        "Title":"Launch",
        "DateTime":"13:30"
      }
    ],
    "2":[
      {
        "Title":"Test",
        "DateTime":"9:30"
      }
    ]
  }
]

Здесьэто код:

public class 1
{
    public string Title { get; set; }
    public string DateTime { get; set; }
}

public class 2
{
    public string Title { get; set; }
    public string DateTime { get; set; }
}

public class MonthEventsResponseModel
{
    public IList<1> 1 { get; set; }
    public IList<2> 2 { get; set; }
    // and so on to 31
}

Так что, если есть лучшее решение для достижения этого, я рад знать.

Ответы [ 3 ]

0 голосов
/ 28 февраля 2019

Один из подходов был бы:

1) Создать перечисление для всего месяца в году,

public enum Month
{
    NotSet = 0,
    January = 1,
    February = 2,
    March = 3,
    April = 4,
    May = 5,
    June = 6,
    July = 7,
    August = 8,
    September = 9,
    October = 10,
    November = 11,
    December = 12
}

2) Создать один пользовательский метод, который может занять перечисление выше месяца для определенногогод, и он рассчитывает количество дней в данном месяце, и для каждого дня вы можете заполнить данные вашего события

public static MonthEventsResponseModel GetEventData(int year, Month month)
{
    var days = DateTime.DaysInMonth(year, (int)month);

    MonthEventsResponseModel model = new MonthEventsResponseModel();
    model.Events = Enumerable.Range(1, days)
        .Select(day => new
        {
            Day = day,
            Event = new List<Event>()  //<= Instead of new list, Fill Event data with respect to particular day from List or Database Call or API call
        })
        .ToDictionary(x => x.Day, y => y.Event);

    return model;
}

3) Затем вызвать метод выше, как,

MonthEventsResponseModel model = GetEventData(2018, Month.December);

4) Наконец, конвертируйте вашу модель в json,

string json = JsonConvert.SerializeObject(model);

5) И модели классов,

public class Event
{
    public string Title { get; set; }
    public string DateTime { get; set; }
}

public class MonthEventsResponseModel
{
    public Dictionary<int, List<Event>> Events { get; set; }
}
0 голосов
/ 28 февраля 2019

Я бы пошел вперед и сделал бы модели Событие, День, Месяц, каждая из которых отвечала бы за сериализацию -

Событие

    public class Event
    {
        public string Title { get; set; }
        public string DateTime { get; set; }

        public string MakeJson()
        {

            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder
                .Append("  {").AppendLine()
                .Append("    \"Title\":\"" + Meeting + "\",").AppendLine()
                .Append("    \"DateTime\":\"" + DateTime + "\"").AppendLine()
                .Append("  },").AppendLine();

            return stringBuilder.ToString();
        }
    }

День

    public class Day
    {
        public string DayNo { get; set; }
        public List<Event> Events { get; set; }

        public string MakeJson()
        {
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append("\"" + DayNo + "\":[").AppendLine();    

            foreach (Event ev in Events)
            {
                stringBuilder.Append(ev.MakeJson());
            }

            stringBuilder.AppendLine().Append("],").AppendLine();

            return stringBuilder.ToString();
        }
    }

Месяц

    public class Month{

        public List<Day> Days { get; set; }

        public string MakeJson()
        {
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.Append("[")
                .AppendLine().Append(" {")
                .AppendLine();

            foreach (Day day in Days)
            {
                stringBuilder.Append(day.MakeJson());
            }

            stringBuilder.Append(" }")
                .AppendLine().Append("]")
                .AppendLine();


        }
    }

После того, как вы заполните модели, просто позвоните MakeJson () в месяц, и все готово.

0 голосов
/ 28 февраля 2019

Создайте класс, который будет описывать событие:

public class Event
{
    public string Title { get; set; }
    public string DateTime { get; set; }
}

И измените ваш MonthEventsResponseModel на это:

public class MonthEventsResponseModel
{
    public Dictionary<int, List<Event>> Events { get; set; }
}

Теперь вы можете десериализовать свой JSON с помощью метода DeserializeObjectи немного linq:

var json = "[\r\n  {\r\n    \"1\":[\r\n      {\r\n        \"Title\":\"Meeting\",\r\n        \"DateTime\":\"12:40\"\r\n      },\r\n      {\r\n        \"Title\":\"Launch\",\r\n        \"DateTime\":\"13:30\"\r\n      }\r\n    ],\r\n    \"2\":[\r\n      {\r\n        \"Title\":\"Test\",\r\n        \"DateTime\":\"9:30\"\r\n      }\r\n    ]\r\n  }\r\n]";

var result = JsonConvert.DeserializeObject<Dictionary<string, Event[]>[]>(json)
    .Select(x => new MonthEventsResponseModel
    {
        Events = x.ToDictionary(k => int.Parse(k.Key), v => v.Value.ToList())
    }).ToArray();
...