我必须将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)创建一年中整个月的枚举,
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; }
}
创建一个将描述事件的类:
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; }
}
现在,您可以使用DeserializeObject
方法和一些LINQ对JSON进行测试:
var json = "[rn {rn "1":[rn {rn "Title":"Meeting",rn "DateTime":"12:40"rn },rn {rn "Title":"Launch",rn "DateTime":"13:30"rn }rn ],rn "2":[rn {rn "Title":"Test",rn "DateTime":"9:30"rn }rn ]rn }rn]";
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();
我会继续进行活动,日,月模型,每个人都负责序列化 -
事件
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(),就可以了。