C# 如何从嵌套JSON数组中按键获取值?
使用下面显示的JSON结果。我试图从“ActionId”中获取值,在本例中,它是“b0160455-e9d5-4692-850e-4958c8c45f8c” 在呈现到Razor页面列表视图时,我需要在foreach循环中访问此值 到目前为止,我已经能够访问第一级对象: 例如:C# 如何从嵌套JSON数组中按键获取值?,c#,arrays,json,C#,Arrays,Json,使用下面显示的JSON结果。我试图从“ActionId”中获取值,在本例中,它是“b0160455-e9d5-4692-850e-4958c8c45f8c” 在呈现到Razor页面列表视图时,我需要在foreach循环中访问此值 到目前为止,我已经能够访问第一级对象: 例如: @foreach (var item in Model.LogEvents.EventEntities) { @Html.DisplayFor(modelItem => item.Level) } 但我
@foreach (var item in Model.LogEvents.EventEntities)
{
@Html.DisplayFor(modelItem => item.Level)
}
但我无法计算出从JSON结果中的嵌套数组“Properties”获取值所需的代码:
{
"lastReadEventId": "event-58cc86503c8d08d8313d010000000000",
"scannedEventCount": 1,
"eventEntities": [
{
"timestamp": "2020-08-09T18:55:05.0779216+01:00",
"properties": [
{
"name": "SourceContext",
"value": "WebApp_RAZOR.Pages.Logs.IndexModel"
},
{
"name": "ActionId",
"value": "b0160455-e9d5-4692-850e-4958c8c45f8c"
},
{
"name": "ActionName",
"value": "/Logs/Index"
},
{
"name": "RequestId",
"value": "0HM1SHK90IVGB:00000001"
},
{
"name": "RequestPath",
"value": "/Logs/Index"
},
{
"name": "SpanId",
"value": "|e7eeae4d-4d24315c2124a72d."
},
{
"name": "TraceId",
"value": "e7eeae4d-4d24315c2124a72d"
},
{
"name": "ParentId",
"value": ""
},
{
"name": "MachineName",
"value": "DESKTOP-OS52032"
},
{
"name": "ProcessId",
"value": 22676
},
{
"name": "ThreadId",
"value": 14
}
],
"messageTemplateTokens": [
{
"text": "superadmin@hjbuybub.onmicrosoft.com requested the Index page"
}
],
"eventType": "$DA057814",
"level": "Information",
"renderedMessage": "superadmin@gegerggere.onmicrosoft.com requested the Index page",
"id": "event-5345465467567b575675",
"links": {
"Self": "api/events/event-55b5456yubu5u67ub7u5{?download,render,clef}",
"Group": "api/events/resources"
}
}
]
}
从json结果派生的类:
public class LogEvents
{
public string LastReadEventId { get; set; }
public int ScannedEventCount { get; set; }
public EventEntity[] EventEntities { get; set; }
}
public class EventEntity
{
public DateTime Timestamp { get; set; }
public Property[] Properties { get; set; }
public MessageTemplateToken[] MessageTemplateTokens { get; set; }
public string EventType { get; set; }
public string Level { get; set; }
public string RenderedMessage { get; set; }
public string Id { get; set; }
public Links Links { get; set; }
}
public class Links
{
public string Self { get; set; }
public string Group { get; set; }
}
public class Property
{
public string Name { get; set; }
public object Value { get; set; }
}
public class MessageTemplateToken
{
public string Text { get; set; }
}
我在这里尝试了以下其他问答,但每个人的要求总是不同的,而且总是被卡住。其中一个选项是使用Newtonsoft的Json.NET: 或者根据您的班级结构,应该是:
var actionIds = Model.LogEvents
.SelectMany(le => le.Properties)
.Where(p => p.Name == "ActionId")
.Select(p => p.Value) // also can add `ToString` here since Value is an object
.ToList();
其中一个选项是使用Newtonsoft的Json.NET: 或者根据您的班级结构,应该是:
var actionIds = Model.LogEvents
.SelectMany(le => le.Properties)
.Where(p => p.Name == "ActionId")
.Select(p => p.Value) // also can add `ToString` here since Value is an object
.ToList();
尝试使用ChoetlJSON阅读器(来自nuggets)。您需要从中加载JSON并读取JSON,然后使用动态“foreach item”。如果item.name==“ActionId”,则可以使用item.value执行任何操作
以下是指南:尝试使用CHOETL json阅读器(来自nuggets)。您需要从中加载JSON并读取JSON,然后使用动态“foreach item”。如果item.name==“ActionId”,则可以使用item.value执行任何操作 以下是指南:像这样:
@foreach (var item in Model.LogEvents.EventEntities)
{
@Html.DisplayFor(modelItem => item.Level.Properties
.Single(x => x.Name == "ActionId").Value)
}
它的意思是“在项.Properties
数组中,获取唯一的元素x,其中x.Name
等于“ActionId”
,并返回其值
如果不希望在没有此类元素时崩溃,可以查看:
@Html.DisplayFor(modelItem =>
(
item.Level.Properties
.SingleOrDefault(x => x.Name == "ActionId")
?? new Property(){ Value = "Not found" }
).Value
Single[OrDefault]坚持只有一个元素与规则匹配。如果您不想让它在有多个名为ActionId的元素时崩溃,请使用[First/Last][OrDefault]
。如果您想要的ActionId既不是第一个也不是最后一个,则必须按照您需要的逻辑(即“第二个”)其值以“a”等开头的值)
实际上,您甚至不应该在视图中执行所有这些代码。准备一个模型并将其发送到视图的整个想法是,该模型可以使用简单的属性和数据,为视图进行格式化和准备。您不应该在视图中执行大量复杂的LINQ、错误处理、moel转换等 “仅仅因为你可以,并不意味着你应该”:)像这样:
@foreach (var item in Model.LogEvents.EventEntities)
{
@Html.DisplayFor(modelItem => item.Level.Properties
.Single(x => x.Name == "ActionId").Value)
}
它的意思是“在项.Properties
数组中,获取唯一的元素x,其中x.Name
等于“ActionId”
,并返回其值
如果不希望在没有此类元素时崩溃,可以查看:
@Html.DisplayFor(modelItem =>
(
item.Level.Properties
.SingleOrDefault(x => x.Name == "ActionId")
?? new Property(){ Value = "Not found" }
).Value
Single[OrDefault]只坚持一个元素与规则匹配。如果您不希望它在有多个名为ActionId的元素时崩溃,请使用[First/Last][OrDefault]
。如果您想要的ActionId既不是第一个也不是最后一个,那么您必须按照您需要的逻辑(即“第二个”、“其值以“a”开头的那个”等)将其挖掘出来
实际上,在你看来,你甚至不应该做所有这些代码。准备一个模型并将其发送到视图的整个想法是,该模型可以使用简单的属性和数据,为视图进行格式化和准备。在你看来,你不应该做大量复杂的LINQ、错误处理、moel转换等
“仅仅因为你可以,并不意味着你应该”:)你做过“将json粘贴为类”吗“/使用QuickType.io从json生成类?我在Visual Studio中使用“编辑然后粘贴特殊”将json结果粘贴到类中。如果这有帮助的话,请将它们添加到我的Q中……您是否完成了“将json粘贴为类”/使用QuickType.io从json生成类?我在Visual Studio中使用“编辑然后粘贴特殊”将json结果粘贴到类中。如果这有帮助的话,只是将它们添加到我的Q中……当遍历Razor列表视图的循环时,这将如何工作?i、 e.我给出的第一级对象的示例是@Html.DisplayFor(modelItem=>item.level)@OJB1,您正在寻找类似于或的东西?json路径实现看起来与我所追求的内容一致,以前没有看到过,所以在我们说话的时候仔细阅读它。无法理解。。。使用Newtonsoft的Json.NET Json路径实现:我尝试了“@Html.DisplayFor(modelItem=>item.Properties[?(@.name=='ActionId')].value]),但它甚至无法编译。当遍历Razor列表视图的循环时,这是如何工作的?i、 e.我给出的第一级对象的示例是@Html.DisplayFor(modelItem=>item.level)@OJB1,您正在寻找类似于或的东西?json路径实现看起来与我所追求的内容一致,以前没有看到过,所以在我们说话的时候仔细阅读它。无法理解。。。使用Newtonsoft的Json.NET Json路径实现:我尝试了“@Html.DisplayFor(modelItem=>item.Properties[?(@.name=='ActionId')].value]),但它甚至不会编译EthatAnks Caius,我尝试了您上面的代码,并接受了您关于不在视图中执行此级别查询的评论。无论如何,不会使用“表达式树lambda可能不包含null propogating运算符”消息为我编译。您是否建议我在将json返回的数据添加到视图之前,首先将其添加到页面模型中的列表中?我修复了代码,因此它不使用null属性,但是是的;这正是我要说的。模型中应包含随时可用的数据;您的模型不应该包含这个非常复杂的对象树,这些对象可能/不存在/使用,而让您的视图来选择它们并相应地执行操作。生成模型的代码应该完成大部分的展平和验证工作。这并不是说一个模型不应该有层次化的元素,只是模型应该表示视图需要做什么,而不是所有无关的东西