JSONPath中的字符串函数

a14dhokn  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(80)

我正在使用Json.NetSelectToken方法来使用JSONPath查询JSON,表达式如下:

JToken acme = o.SelectToken("$.Manufacturers[?(@.Name == 'Acme Co')]");

字符串
-- http://www.newtonsoft.com/json/help/html/QueryJsonSelectTokenJsonPath.htm

JSONPath是否支持XPath样式的字符串函数?

我所说的字符串函数是指在XPath中如何使用like?
例如,contains()方法是否有语法?
我试过了

o.SelectToken("$.Manufacturers[?(contains(@.Name, 'Acme')]");


但是JSON.NET会抱怨语法错误(它不喜欢contains)。

jljoyd4f

jljoyd4f1#

Json.NET Release 11为JSONPath查询引入了regex operator=~。使用它,你可以进行字符串模式匹配,包括contains()匹配。举例来说:

  • 要匹配包含字符串Acme的值,请使用=~ /Acme/
o.SelectToken("$.Manufacturers[?(@.Name =~ /Acme/)]")

字符串

  • 要匹配包含单词Acme的值,请将其括在\b中:
o.SelectToken("$.Manufacturers[?(@.Name =~ /\\bAcme\\b/)]")

  • 要对包含acme的字符串进行不区分大小写匹配,请在不区分大小写部分的前面加上(?i)
o.SelectToken("$.Manufacturers[?(@.Name =~ /(?i)acme/)]")


(?-i)结束不区分大小写的匹配。

  • 要匹配不包含Acme的值,请使用=~ /^(?!.*Acme).*$/)
o.SelectToken("$.Manufacturers[?(@.Name =~ /^(?!.*Acme).*$/)]")


参见:C# Regex to match a string that doesn't contain a certain string?

  • 要匹配以**Acme开头的字符串**,请在正则表达式的开头插入^
o.SelectToken("$.Manufacturers[?(@.Name =~ /^Acme/)]")

  • 要匹配以**Acme结尾的字符串**,请在正则表达式末尾添加$
o.SelectToken("$.Manufacturers[?(@.Name =~ /Acme$/)]")

  • 要匹配具有**指定长度N**的字符串,请使用=~ /(?s)^.{N}$/)
o.SelectToken("$.Manufacturers[?(@.Name =~ /(?s)^.{7}$/)]")


这里(?s)指定单行模式(强制将换行符包括在字符计数中),.匹配任何字符,quantifier.{7}需要前面标记.的7个匹配,^$匹配字符串的开头和结尾(这将防止正则表达式匹配长度超过7个字符的字符串)。
演示小提琴here

相关问题