Как справиться с апострофом в выражении фильтра? - PullRequest
0 голосов
/ 22 октября 2019

С учетом некоторых 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's Automotive:

{
  "type"  : "Bill's Automotive",
  "number": "0123-4567-8888"
}

Используя Json.NET, который использует jsonpath синтаксис, у меня есть выражение фильтра:

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

Очевидно, он видит апостроф и считает его концом строки запроса.

Другие варианты, которые я пробовал

  • phoneNumbers.[?(@.type=="Bill's Automotive")]
  • phoneNumbers.[?(@.type=="Bill\'s Automotive")]
  • phoneNumbers.[?(@.type=="Bill''s Automotive")]
  • phoneNumbers.[?(@.type=="Bill\u0027s Automotive")]

Так что я сдаюсь.

Как вы фильтруете json в Newtonsoft Json.NET?

Ответы [ 3 ]

4 голосов
/ 22 октября 2019

Вам необходимо предоставить кавычку с обратным слешем в запросе:

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

Обратите внимание, что для переноса поискового термина вам нужны одинарные кавычки и \\, поэтому окончательная строка на самом деле содержит \'.

0 голосов
/ 22 октября 2019

Я не знаю, как это сделать с SelectToken, но См. Ответ Алексея, чтобы избежать кавычки, но вы можете сделать это с некоторым LINQ .

 var billsPhone = o["phoneNumbers"]
                  .FirstOrDefault(t => t["type"].Value<string>() == "Bill's Automotive");
...