#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]
, вы все равно получили бы ту же вложенную структуру, которую опубликовали. (Здесь не для того, чтобы обсуждать, как это может сработать; просто объясняю, почему это не работает сейчас.)