从 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;
}
我建议使用表示 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;
}