Путь JSON для возврата всего json, который соответствует предикату

#java #json #jsonpath

Вопрос:

У меня есть usecase, где мне понадобится путь JSON, чтобы вернуть всю структуру json, которая соответствует его предикату.

    {
  "store" : {
    "book" : [
      {
        "category" : "reference",
        "author" : "Nigel Rees",
        "title" : "Sayings of the Century",
        "price" : 8.95,
       },
     {
        "category" : "fiction",
        "author" : "Evelyn Waugh",
        "title" : "Sword of Honour",
        "price" : 12.99
     },
     {
        "category" : "fiction",
        "author" : "Herman Melville",
        "title" : "Moby Dick",
        "isbn" : "0-553-21311-3",
        "price" : 8.99
     },
     {
        "category" : "fiction",
        "author" : "J. R. R. Tolkien",
        "title" : "The Lord of the Rings",
        "isbn" : "0-395-19395-8",
        "price" : 22.99
     }
  ],
  "bicycle" : {
     "color" : "red",
     "price" : 19.95
  }
  },
    "expensive" : 10
}
 

Это мой json path expression

 $.store.book[?(@.category in ['reference'])]
 

который возвращает

  [
{
  "category" : "reference",
  "author" : "Nigel Rees",
  "title" : "Sayings of the Century",
  "price" : 8.95
 }
 

]

Но я хочу пройти весь путь, как показано ниже,

 { 
  "store" : {
     "book" : [
        {
  "category" : "reference",
  "author" : "Nigel Rees",
  "title" : "Sayings of the Century",
  "price" : 8.95
 }

        ] 
  }
}
 

Ответ №1:

Обычно это не то, что может сделать JSON-путь, но сверьтесь с вашей конкретной реализацией.

Обычно путь JSON может возвращать совпадения или пути к ним. Получение вложенного соответствия, как оно отображается в исходной структуре, не поддерживается.

Однако вы могли бы экстраполировать то, что вам нужно, с пути. Путь к этому пункту был бы таким $.store.book[0] . Чтобы перестроить нужный вам объект, вам нужно…

 $        // start, no impact
.store  // create an object with "store"
.book   // create an object with "book"
[0]     // since this is the last thing, replace this with the match
 

Глядя на это, кажется, что возникла бы проблема с поддержкой этого, если бы совпадение находилось дальше в массиве, а не в самом начале. Например, если бы вы сопоставили [2] вместо [0] , вы все равно получили бы ту же вложенную структуру, которую опубликовали. (Здесь не для того, чтобы обсуждать, как это может сработать; просто объясняю, почему это не работает сейчас.)