Dot-Net

可以使用 JSONPath 搜尋不區分大小寫嗎?

  • July 25, 2021

使用 JSON.NET 的SelectToken方法來選擇帶有JSONPath的令牌,我發現無法指定搜尋應該不區分大小寫。

例如

json.SelectToken("$.maxAppVersion")

應該返回一個匹配的標記,不管它是寫maxappversion的,MAXAPPVERSION還是任何其他的大小寫。

我的問題:

是否有官方方式或至少一種解決方法以不區分大小寫的方式使用 JSONPath?

(我發現的最接近的是 JSON 的 Java 實現的類似問題)

從 8.0.2 版開始,這在 Json.NET 中沒有實現。

JSONPath 屬性名稱匹配由兩個類完成:FieldFilter簡單名稱匹配和ScanFilter遞歸搜尋。 FieldFilter具有以下程式碼,其中oa JObject

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 的區分大小寫保持一致。)

引用自:https://stackoverflow.com/questions/35704390