C# 如何处理过滤器表达式中的撇号?

C# 如何处理过滤器表达式中的撇号?,c#,json.net,jsonpath,C#,Json.net,Jsonpath,给定一些json: { "firstName": "John", "lastName" : "doe", "age" : 26, "address" : { "streetAddress": "naist street", "city" : "Nara", "postalCode" : "630-0192" }, "phoneNumbers": [ { "type" : "Bill's Auto

给定一些json:

{
  "firstName": "John",
  "lastName" : "doe",
  "age"      : 26,
  "address"  : {
    "streetAddress": "naist street",
    "city"         : "Nara",
    "postalCode"   : "630-0192"
  },
  "phoneNumbers": [
    {
      "type"  : "Bill's Automotive",
      "number": "0123-4567-8888"
    },
    {
      "type"  : "home",
      "number": "0123-4567-8910"
    }
  ]
}
我想返回Bill的汽车电话号码对象:

{
  "type"  : "Bill's Automotive",
  "number": "0123-4567-8888"
}
使用Json.NET(使用语法),我得到了过滤器表达式:

phoneNumbers.[?(@.type=="Bill's Automotive")]
当您在以下设备上进行测试时,此功能运行良好:

在那里你可以自己试一试

但在Json.net中失败 但在C#中,在运行时使用Newtonsoft Json.Net时,代码会抛出一个异常:

JToken billsPhone= o.SelectToken("phoneNumbers.[?(@.type=="Bill's Automotive")]");

Newtonsoft.Json.JsonException: Unexpected character while parsing path query: s
显然,它看到撇号,并认为它是查询字符串的结尾

我尝试过的其他变体

  • 电话号码。[(@.type==“比尔的汽车”)]
  • 电话号码。[(@.type==“比尔的汽车”)]
  • 电话号码。[(@.type==“比尔的汽车”)]
  • 电话号码。[(@.type==“Bill\u0027s Automotive”)]
所以我放弃了


如何在Newtonsoft json.NET中过滤json?

您需要为查询提供反斜杠转义引号:

JToken billsPhone = o.SelectToken("phoneNumbers.[?(@.type=='Bill\\'s Automotive')]");

请注意,您需要单引号来包装搜索词和
\\
,因此最终字符串实际上包含
\'

您需要为查询提供反斜杠转义引号:

JToken billsPhone = o.SelectToken("phoneNumbers.[?(@.type=='Bill\\'s Automotive')]");
请注意,您需要单引号来包装搜索词和
\\
,因此最后一个字符串实际上包含
\'

我不知道如何使用
SelectToken
,但请参阅Alexei关于转义引号的答案,但您可以使用一些

var billsPhone=o[“电话号码”]
.FirstOrDefault(t=>t[“type”].Value()==“比尔的汽车”);
我不知道如何使用
SelectToken
,但请参阅Alexei关于转义引号的答案,但您可以使用一些

var billsPhone=o[“电话号码”]
.FirstOrDefault(t=>t[“type”].Value()==“比尔的汽车”);


使用Linq To对象应该很简单。这是一个选项,而不是jsonpath吗?转义双引号,而不是单引号。转义字符:\'使用Linq To对象应该很简单。这是一个选项,而不是jsonpath吗?转义双引号,而不是单引号。转义字符:\'您使用的是哪个版本的Newtonsoft Json.Net?您显示的代码似乎与当前(12.x)的代码不兼容,该代码声称
是意外的…我的意思是它确实可以编译,而不像问题中显示的示例那样…但不能比OP所说的更早工作-因此问题中最有可能的代码不是100%尝试过一次OP(但足够接近).您使用的是哪个版本的Newtonsoft Json.Net?您显示的代码似乎与当前(12.x)版本不兼容,该版本声称
是意外的。。。我的意思是它确实不像问题中显示的样本。。。但并没有比OP说的更早起作用——所以问题中最有可能的代码不是100%尝试过一次OP(但足够接近)。
JToken billsPhone = o.SelectToken(@"phoneNumbers.[?(@.type==""Bill's Automotive"")]");