Как получить весь json с результатом, отраженным после фильтра по строке, используя JSONPath

#json #jsonpath #jayway

#json #jsonpath #jayway

Вопрос:

Могу ли я получить весь json с результатом, отраженным после фильтрации по строке, используя JSONPath?

  • Перед 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
            } 
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}

  
  • После JSON (я хочу этот результат)
 {
    "store": {
        "book": [
            {
                "category": "reference",
                "author": "Nigel Rees",
                "title": "Sayings of the Century",
                "price": 8.95
            }       
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}
  

Фильтр по строке для книги выполняется через ‘$..book[?(@.author = ~ /.*REES/i)]’

но можете ли вы сказать мне, как отразить весь JSON?

Ответ №1:

Вы не можете сделать это с помощью JSONPath; хотя вы хотите выбрать самый внешний элемент на основе свойства inner items, вы не хотите извлекать внешний элемент целиком. Это не работает.

Выбор внешнего элемента можно выполнить следующим образом

 $..store[?(@.book[0].author =~ /.*REES/i)]
  

но это также вернет книгу в позицию 2, т.Е. Индекс 1.

Похоже, вам действительно нужно преобразование JSON, такое как Jolt.

Например, Jolt’s remove transformer позволит вам удалить вторую книгу следующим образом:

 [
  {
    "operation": "remove",
    "spec": {
      "store": {
        "book": {
          "array": {
            "1": "" //remove book at position 2
          }
        }
      }
    }
  }
]
  

Попробуйте это онлайн с вашим собственным вводом здесь.

Комментарии:

1. Один JSONPath не может этого сделать ..! Я буду искать Jolt . Спасибо за ответ!