gpt4 book ai didi

.net - 可以使用JSONPath搜索不区分大小写的内容吗?

转载 作者:行者123 更新时间:2023-12-03 17:49:34 24 4
gpt4 key购买 nike

使用JSON.NET的 SelectToken method选择带有JSONPath的 token ,我发现没有办法指定搜索应该不区分大小写。

例如。

json.SelectToken("$.maxAppVersion")

无论返回的是 maxappversionMAXAPPVERSION还是任何其他大小写形式,都应返回匹配的 token 。

我的问题:

是否存在不区分大小写的方式使用JSONPath的正式方法或至少是变通方法?

(我找到的最接近的是JSON的Java实现的 this similar question)

最佳答案

从8.0.2版开始,在Json.NET中未实现此功能。

JSONPath属性名称匹配由两个类完成: FieldFilter 用于简单名称匹配,而 ScanFilter 用于递归搜索。 FieldFilter具有以下代码,其中oJObject:

JToken v = o[Name];
if (v != null)
{
yield return v;
}

内部 JObject 使用 JPropertyKeyedCollection 来保存其属性,该属性进而使用以下比较器进行属性名称查找:
private static readonly IEqualityComparer<string> Comparer = StringComparer.Ordinal;

因此,它区分大小写。同样, ScanFilter具有:
JProperty e = value as JProperty;
if (e != null)
{
if (e.Name == Name)
{
yield return e.Value;
}
}

这也是区分大小写的。

JSONPath standard中没有提到不区分大小写的匹配,因此我认为开箱即用就无法找到您想要的内容。

解决方法是,您可以为此添加自己的扩展方法:
public static class JsonExtensions
{
public static IEnumerable<JToken> CaseSelectPropertyValues(this JToken token, string name)
{
var obj = token as JObject;
if (obj == null)
yield break;
foreach (var property in obj.Properties())
{
if (name == null)
yield return property.Value;
else if (string.Equals(property.Name, name, StringComparison.OrdinalIgnoreCase))
yield return property.Value;
}
}

public static IEnumerable<JToken> CaseSelectPropertyValues(this IEnumerable<JToken> tokens, string name)
{
if (tokens == null)
throw new ArgumentNullException();
return tokens.SelectMany(t => t.CaseSelectPropertyValues(name));
}
}

然后将它们与标准的 SelectTokens调用链接在一起,例如:
var root = new { Array = new object[] { new { maxAppVersion = "1" }, new { MaxAppVersion = "2" } } };

var json = JToken.FromObject(root);

var tokens = json.SelectTokens("Array[*]").CaseSelectPropertyValues("maxappversion").ToList();
if (tokens.Count != 2)
throw new InvalidOperationException(); // No exception thrown

(相关信息,请参阅Json.NET问题 Provide a way to do case-sensitive property deserialization,该问题要求区分大小写的契约(Contract)解析器以确保与LINQ-to-JSON区分大小写的一致性。)

关于.net - 可以使用JSONPath搜索不区分大小写的内容吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35704390/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com