努力使用 LINQ 方法语法来查找值

问题描述 投票:0回答:1

从 API(GA4 元数据 API)获取此 JSON


{
  "dimensions": [
    {
      ....
    }
  ],
  "metrics": [
    ....
    {
      "apiName": "keyEvents",
      "uiName": "Key events",
      "description": "The count of key events. Marking an event as a key event affects reports from time of creation. It doesn't change historic data. You can mark any event as key in Google Analytics, and some events (such as `first_open` or `purchase`) are marked as key events by default.",
      "deprecatedApiNames": [
        "conversions"
      ],
      "type": "TYPE_FLOAT",
      "category": "Event"
    },
    {
      "apiName": "newUsers",
      "uiName": "New users",
      "description": "The number of users who interacted with your site or launched your app for the first time (event triggered: first_open or first_visit).",
      "type": "TYPE_INTEGER",
      "category": "User"
    },

我有一个从 apiName 返回 uiName 的函数:

我想返回 apiName 匹配的 uiName 或它出现在已弃用列表中的位置。 但我在 JSON 方面的 Linq 技能无法胜任这项任务。我以为会是这样的,但是 JsonElement 没有方法 ToList()。

    // param "type" in ["dimensions","metrics"]
    private string MemberFriendlyName(JsonDocument metadata, string type, string apiName)
    {
        string uiName = metadata
            .RootElement
            .GetProperty(type)
            .EnumerateArray()
            .Where(me => (
                (me.TryGetProperty("apiName", out me) && me.GetString() == apiName)
                    ||
                (me.TryGetProperty("deprecatedApiNames", out me) && me.ToList().Contains(apiName))
            ))
            //.Where(me => me.GetPropertyNullable("apiName")?.GetString() == apiName)
            .FirstOrDefault()
            .GetPropertyNullable("uiName")?.GetString();
        return uiName;
    }

c# linq
1个回答
0
投票

我建议使用表示 JSON 文档结构的类来解析数据,但如果您坚持使用 LINQ,那么首先不要重复使用

me
中的 lambda 参数名称 (
Where
) 来表示
TryGetProperty 
调用,创建单独的变量,然后使用
EnumerateArray
代替
ToList
。沿着这些思路(删除了
GetPropertyNullable
的用法,因为它不是框架 AFAIK 的一部分,还需要添加检查/验证/保障措施):

string MemberFriendlyName(JsonDocument metadata, string type, string apiName)
{
    string uiName = metadata
        .RootElement
        .GetProperty(type)
        .EnumerateArray()
        .Where(me => (
            (me.TryGetProperty("apiName", out var name) && name.GetString() == apiName)
            ||
            (me.TryGetProperty("deprecatedApiNames", out var dep) && dep.EnumerateArray()
                .Any(je => je.GetString() == apiName))
        ))
        .FirstOrDefault()
        .GetProperty("uiName")
        .GetString();
    return uiName;
}
© www.soinside.com 2019 - 2024. All rights reserved.