如何使用 JSONPath(或任何其他选项)查询未命名的 JSON 数组?
How to use JSONPath (or any other option) to query an unnamed JSON array?
REST API 服务为我的 C# 代码提供了以下 JSON:
[
{
"contentUri": "https://somewhere.com/aGuid1",
"contentId": "2"
},
{
"contentUri": "https://somewhere.com/aGuid2",
"contentId": "3"
},
{
"contentUri": "https://somewhere.com/aGuid3",
"contentId": "4"
}
]
以上 JSON 被简化,实际响应是一个非常大的字符串 ,因此字符串操作将是昂贵的和内存密集型的。
问题是上面的JSON数组没有名字。所以我无法将它解析为 JArray,除非我操作 JSON 字符串并为其添加名称。我喜欢避免这种情况。
我可以完美地将上面的JSON解析成JToken。现在我喜欢使用 JToken.SelectToken and JSONPath
在 JToken 中查询
上面JSON数组中所有元素的JSON路径returns是什么?
上面 JSON 数组中的所有 contentUri 值的 JSONPath returns 是什么?
我尝试了很多JSON路径查询,但没有锁定,因为数组没有名称。
你可以很容易地将上面的json解析成JArray
:
JArray array = JArray.Parse(jsonString);
要获取数组中的所有对象,不需要 JSONPath 表达式,只需遍历数组即可:
foreach (JObject child in array)
{
Console.WriteLine("contentUri: " + (string)child["contentUri"]);
Console.WriteLine("contentId: " + (string)child["contentId"]);
}
为了完整起见,获取所有数组值的等效 JSONPath 表达式是 [*]
。但它在这里并没有真正给你买任何东西。
要仅获取所有 contentUri
值,您可以将 SelectTokens
与 JSONPath [*].contentUri
:
一起使用
foreach (JToken uri in array.SelectTokens("[*].contentUri"))
{
Console.WriteLine(uri);
}
或者,您可以 Select
他们这样:
foreach (string uri in array.Select(t => (string)t["contentUri"]))
{
Console.WriteLine(uri);
}
Fiddle: https://dotnetfiddle.net/C2gIWX
REST API 服务为我的 C# 代码提供了以下 JSON:
[
{
"contentUri": "https://somewhere.com/aGuid1",
"contentId": "2"
},
{
"contentUri": "https://somewhere.com/aGuid2",
"contentId": "3"
},
{
"contentUri": "https://somewhere.com/aGuid3",
"contentId": "4"
}
]
以上 JSON 被简化,实际响应是一个非常大的字符串 ,因此字符串操作将是昂贵的和内存密集型的。
问题是上面的JSON数组没有名字。所以我无法将它解析为 JArray,除非我操作 JSON 字符串并为其添加名称。我喜欢避免这种情况。
我可以完美地将上面的JSON解析成JToken。现在我喜欢使用 JToken.SelectToken and JSONPath
在 JToken 中查询上面JSON数组中所有元素的JSON路径returns是什么?
上面 JSON 数组中的所有 contentUri 值的 JSONPath returns 是什么?
我尝试了很多JSON路径查询,但没有锁定,因为数组没有名称。
你可以很容易地将上面的json解析成JArray
:
JArray array = JArray.Parse(jsonString);
要获取数组中的所有对象,不需要 JSONPath 表达式,只需遍历数组即可:
foreach (JObject child in array)
{
Console.WriteLine("contentUri: " + (string)child["contentUri"]);
Console.WriteLine("contentId: " + (string)child["contentId"]);
}
为了完整起见,获取所有数组值的等效 JSONPath 表达式是 [*]
。但它在这里并没有真正给你买任何东西。
要仅获取所有 contentUri
值,您可以将 SelectTokens
与 JSONPath [*].contentUri
:
foreach (JToken uri in array.SelectTokens("[*].contentUri"))
{
Console.WriteLine(uri);
}
或者,您可以 Select
他们这样:
foreach (string uri in array.Select(t => (string)t["contentUri"]))
{
Console.WriteLine(uri);
}
Fiddle: https://dotnetfiddle.net/C2gIWX