C# 如何从嵌套JSON数组中按键获取值?

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) } 但我

使用下面显示的JSON结果。我试图从“ActionId”中获取值,在本例中,它是“b0160455-e9d5-4692-850e-4958c8c45f8c”

在呈现到Razor页面列表视图时,我需要在foreach循环中访问此值

到目前为止,我已经能够访问第一级对象:

例如:

@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属性,但是是的;这正是我要说的。模型中应包含随时可用的数据;您的模型不应该包含这个非常复杂的对象树,这些对象可能/不存在/使用,而让您的视图来选择它们并相应地执行操作。生成模型的代码应该完成大部分的展平和验证工作。这并不是说一个模型不应该有层次化的元素,只是模型应该表示视图需要做什么,而不是所有无关的东西