Dot-Net
可以使用 JSONPath 搜尋不區分大小寫嗎?
使用 JSON.NET 的
SelectToken方法來選擇帶有JSONPath的令牌,我發現無法指定搜尋應該不區分大小寫。例如
json.SelectToken("$.maxAppVersion")應該返回一個匹配的標記,不管它是寫
maxappversion的,MAXAPPVERSION還是任何其他的大小寫。我的問題:
是否有官方方式或至少一種解決方法以不區分大小寫的方式使用 JSONPath?
(我發現的最接近的是 JSON 的 Java 實現的類似問題)
從 8.0.2 版開始,這在 Json.NET 中沒有實現。
JSONPath 屬性名稱匹配由兩個類完成:
FieldFilter簡單名稱匹配和ScanFilter遞歸搜尋。FieldFilter具有以下程式碼,其中oaJObject:JToken v = o[Name]; if (v != null) { yield return v; }在內部
JObject使用 aJPropertyKeyedCollection來保存其屬性,而後者又使用以下比較器進行屬性名稱查找: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 標準中沒有提到不區分大小寫的匹配,所以我認為你想要的東西根本就不是開箱即用的。
作為一種解決方法,您可以為此添加自己的擴展方法:
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 問題提供一種區分大小寫的屬性反序列化的方法,該方法請求區分大小寫的契約解析器以與 LINQ-to-JSON 的區分大小寫保持一致。)