C# 将json对象反序列化到字典中,并用PK和值作为ExecutionTime填充键
这是我从API收到的模型C# 将json对象反序列化到字典中,并用PK和值作为ExecutionTime填充键,c#,asp.net-core,serialization,service,C#,Asp.net Core,Serialization,Service,这是我从API收到的模型 var query = FindBy(item => item.TaskEnabledStatus == trueOrFalse).Select(items => new MainGridDto() { PK_Task = items.PK_Task, TaskName = items.TaskName, TaskDescription = items.T
var query = FindBy(item => item.TaskEnabledStatus == trueOrFalse).Select(items => new MainGridDto()
{
PK_Task = items.PK_Task,
TaskName = items.TaskName,
TaskDescription = items.TaskDescription,
TaskEnabledStatus = items.TaskEnabledStatus,
BusinessName = items.tBusinessGroups.BusinessName,
ExecutionTime = items.ExecutionTime.Value,
BusinessGroupDto = new BusinessGroupDto()
{
PK_BusinessGroup = items.tBusinessGroups.PK_BusinessGroup,
BusinessName = items.tBusinessGroups.BusinessName,
BusinessGroupEnabledStatus = items.tBusinessGroups.BusinessGroupEnabledStatus
},
EmailBody = items.EmailBody,
EmailSubject = items.EmailSubject,
UserOwner = items.tUsers.tRecipients.FirstName + " " + items.tUsers.tRecipients.LastName,
UsersDto = new UsersDto()
{
PK_User = items.tUsers.PK_User,
UserName = items.tUsers.UserName,
FirstAndLast = items.tUsers.tRecipients.FirstName + " " + items.tUsers.tRecipients.LastName
},
UserLastModified = items.tUsers.UserName,
Frequency = items.Frequency,
LastModifiedOn = items.LastModifiedOn
});
我试图做的是将对象反序列化到字典中,但由于我的键为null,我不断地得到一个错误。如何将PK分配给字典,并将ExecutionTime作为值。或者甚至将索引指定给键和对象作为值?我让它处理一个列表,但我想把它改成一个字典,以提高搜索效率和性能
var model = JsonConvert.DeserializeObject<Dictionary<int, ReportInfoDto>>(dtoResponse.Result);
这就是我调用API并获得json响应和对象列表的方式
private HttpClient client;
client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:57595/");
var getAllReports = client.GetAsync("api/AllReports").Result;
if (getAllReports.IsSuccessStatusCode)
{
var dtoResponse = getAllReports.Content.ReadAsStringAsync();
dtoResponse.Wait();
var model = JsonConvert.DeserializeObject<Dictionary<int, ReportInfoDto>>(dtoResponse.Result, new KeyValuePairConverter());
var itemsToSendOut = from reports in model
where reports.Value.ExecutionTimeFormatted == DateTime.Now.ToString("hh:mm tt ")
select reports;
因此,在您的示例中,如果您在评论中说:
我试图检查每个报告并查看它们的执行时间,那么听起来您想要的是:
Dictonary<DateTime, MyObject>
同样,如果有一种方法可以在一行反序列化对象中实现所有这些,我很想知道。我看了看,什么地方都没看到。但这会让你得到你的字典,然后你可以快速方便地搜索执行时间
(作为旁注:这假设每个执行时间都是唯一的。如果它们不是唯一的,它将不起作用。)
希望这有帮助
编辑:
你问:
另外,我正在使用linq查询搜索字典。这是一个好的做法还是有更有效的方法
通过值中的某个内容搜索字典实际上否定了字典提供的速度。如果这是你想要的,那么根本就不需要字典。字典的速度之所以快,是因为你可以通过键来搜索值。所以你可以做一个O(1)搜索。然而,如果你正在搜索一个列表(或一个字典的值),那么你在做一个O(n)搜索,其中n是列表或字典中项目的计数 请帮助我理解为什么要这样做:我正在尝试将对象反序列化到字典中
。你说,我让它处理一个列表,但我想把它改成一个字典,以提高搜索效率和性能。
。。您是否在列表中遇到性能问题?在我看来,您试图以一种不打算使用的方式使用字典。因此,我可能正在以一种糟糕的方式实现它,但我正在创建一个窗口服务,它将每分钟调用一个api以获取所有报告。然后,我尝试检查每个报告并查看它们的执行时间,以及它是否与机器当前时间匹配。我将向一些收件人发送一封包含报告的电子邮件。因此,我将不断地在字典中搜索,我的想法是,我可以使用字典并按值搜索,比如说12:00 am,我将在12:00获得所有需要发送的报告,而不是使用列表并逐个搜索。这是有道理的。所以当您调用API时,是否返回单个对象?还是一张物品清单?我这样问是因为我想知道为什么你不只是创建一个字典
,然后使用添加对象。添加而不是尝试反序列化。在我尝试回答之前,我需要一些澄清。确切地说,d响应结果是什么?它是一个单一的物体吗?或者一个对象列表?所以我得到的API响应是Http响应,根据我所知,需要序列化才能使用。(我将更新我的问题,说明如何调用API以及如何接收API)我可以序列化为列表,然后将其转换为字典。然而,我想也许有一种方法可以用字典来代替。是的,我也试着搜索了很多答案,但这肯定会奏效的!非常感谢你和我一起工作,凯西。很乐意帮忙!如果你不介意的话。。。不要忘记将此标记为正确答案(如果是)
Result = "[{\"PK_Task\":3,\"TaskName\":\"ExampleReportName\",\"BusinessName\":\"ExampleBusinessName\",\"UserOwner\":\"Stack Leet\",\"UsersDto\":{\"PK_User\":123,UserName\":\"Stack.L ...
Dictonary<DateTime, MyObject>
// Convert the json string from the API to a List:
List<MyObject> myObjects = JsonConvert.DeserializeObject<List<MyObject>>(dtoResponse.Result);
// Loop over list and make a Dictionary
Dictonary<DateTime, MyObject> model = new Dictonary<DateTime, MyObject>()
foreach (MyObject myObject in myObjects)
{
if (myObject.ExecutionTime != null)
model.Add(myObject.ExecutionTime, myObject);
}
var itemsToSendOut = from reports in model
where reports.Value.ExecutionTimeFormatted == DateTime.Now.ToString("hh:mm tt ")
select reports;