C# 每月每天举办活动的动态班级结构

C# 每月每天举办活动的动态班级结构,c#,asp.net-core,asp.net-core-webapi,C#,Asp.net Core,Asp.net Core Webapi,我必须将JSON表示为类结构,以便在asp.net核心端点中使用它返回这些类。我需要返回当前月份的每一天所持有的对象,以及每天所持有的事件数组 这里是JSON,其中数字是一个月中的一天 [ { "1":[ { "Title":"Meeting", "DateTime":"12:40" }, { "Title":"Launch", "DateTime":"13:30" }

我必须将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
}
公共类1
{
公共字符串标题{get;set;}
公共字符串日期时间{get;set;}
}
公共2级
{
公共字符串标题{get;set;}
公共字符串日期时间{get;set;}
}
公共类MonthEventsResponseModel
{
公共IList 1{get;set;}
公共IList 2{get;set;}
//以此类推到31岁
}

因此,如果有更好的解决方案来实现这一点,我很高兴知道。

创建一个类来描述一个事件:

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; }
}
一种方法是

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;
}
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; }
}
公共类事件
{
公共字符串标题{get;set;}
公共字符串日期时间{get;set;}
}
公共类MonthEventsResponseModel
{
公共字典事件{get;set;}
}

我会继续制作事件、日、月模型,每个模型负责序列化它们自己-

事件

一天

公共课日
{
公共字符串DayNo{get;set;}
公共列表事件{get;set;}
公共字符串MakeJson()
{
StringBuilder StringBuilder=新的StringBuilder();
stringBuilder.Append(“\”+DayNo+“\”:[”).AppendLine();
foreach(事件中的事件ev)
{
Append(ev.MakeJson());
}
stringBuilder.AppendLine().Append(“],”).AppendLine();
返回stringBuilder.ToString();
}
}

公共课月{
公共列表天数{get;set;}
公共字符串MakeJson()
{
StringBuilder StringBuilder=新的StringBuilder();
stringBuilder.Append(“[”)
.AppendLine().Append(“{”)
.AppendLine();
foreach(以天为单位的天)
{
追加(day.MakeJson());
}
stringBuilder.Append(“}”)
.AppendLine().Append(“]”)
.AppendLine();
}
}

填充模型后,只需在当月调用MakeJson(),就可以了。

尽管
List 1
无法编译,但您应该使用
List
,因为不是每个月都有31天。Altrnativly也是一个锯齿形数组,但我不确定这是否是你认为的“更好的解决方案”。请调用类<代码>天>代码>,并有一个属性<代码>月月< /COD>,这是1到(n)天。我不需要对对象进行反序列化,我需要将它们从类序列化为JSON。@IliyanIvanov请显示获取事件的实际数据源。我从EF Core 2.2的事件实体类获取它们。dbContext.Event(返回IQueryable)@IliyanIvanov您需要将您的问题添加到
事件的源代码中
classI解决我的问题,谢谢您的帮助。我需要的类结构是字典Tanks you man,事实上,如果那天没有活动,我不需要填写所有的天,但是你的解决方案非常有用,所以我最好接受你的答案。:)
string json = JsonConvert.SerializeObject(model);
public class Event
{
    public string Title { get; set; }
    public string DateTime { get; set; }
}

public class MonthEventsResponseModel
{
    public Dictionary<int, List<Event>> Events { get; set; }
}
    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();


        }
    }