C# 如何处理过滤器表达式中的撇号?
给定一些json: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
{
"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")]
当您在以下设备上进行测试时,此功能运行良好:
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"")]");