Мне нужен путь JSON к «элементу», когда «условие» равно 1.
{
"customer": [
{
"Addresses": {
"addressDetails": {
"element": "one"
},
"Condition": {
"type": 1
}
}
},
{
"Addresses": [
{
"addressDetails": {
"element": "two"
},
"Condition": {
"type": 0
}
},
{
"addressDetails": {
"element": "three"
},
"Condition": {
"type": 1
}
}
]
}
]
}
Как вы можете видеть в примере: «Адреса» иногда могут представлять собой массив, содержащий несколько деталей. Мне нужно получить «элемент» только из тех, где «Условие» равно 1 — поэтому из этого фрагмента путь JSON должен возвращать «один» и «три». Это возможно?
Я пробовал много разных способов фильтрации с использованием [?(@.==)], но это никогда не работало - мне удалось получить элемент либо из объекта, не являющегося массивом, либо из объекта массива, но никогда из того и другого.



Вам нужен оператор рекурсивного спуска ... Это будет рекурсивно искать по дереву. Начните с этого, а потом уже можете использовать свой фильтр [?...].
$..[?(@.Condition.type == 1)]
Вы можете проверить это на моем сайте: https://json-everything.net/json-path.
Кстати, в новом RFC 9535 скобки не нужны:
$..[[email protected] == 1]
Обратите внимание: поскольку это новая спецификация, реализации все еще догоняют ее, поэтому сверьтесь с библиотекой, которую вы используете.