Фильтровать объект JSON на основе дочерних ключей - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь найти процедурный способ применения следующего фильтра.Учитывая следующий объект, как я могу получить все ключи верхнего уровня, содержащие дочерние c2?

{
  "a1" : {
    "b" : {
      "c1": {},
      "c2": {}
    }
  },
  "a2" : {
    "b" : {
      "c1" : {}
    }
  },
  "a3" : {
    "b" : {
      "c1" : {},
      "c2" : {}
    }
  } 
}

Ожидаемый результат:

["a1", "a3"]

Мне нужен этот фильтр в JSONPath, JMESPathили синтаксис ObjectPath.

Я пробовал бесчисленные комбинации $.*[@.b.c2] в ObjectPath, например, $..[?(b.c2)] в JSONPath, вплоть до таких конструкций, как @.* | [?contains(keys(@), 'c2')] или @.*[b.c2] | @ в JMESPath - все безрезультатно.

1 Ответ

0 голосов
/ 30 ноября 2018

В ObjectPath селекторы работают только со списками, поэтому $. * [@. B.c2] не с чем работать.Вложенные объекты, как в вашем примере, встречаются редко, поэтому я не реализовал способ сделать то, что вам нужно.Вы можете попытаться преобразовать ваш объект в массив следующим образом:

[
  {
    "name": "a1",
    "b": {
      "c1": {},
      "c2": {}
    }
  },
  {
    "name": "a2",
    "b": {
      "c1": {}
    }
  },
  {
    "name": "a3",
    "b": {
      "c1": {},
      "c2": {}
    }
  }
]

и затем используйте селекторы.

$. * [@. B.c2 не является нулевым] .name

PS.Используйте новейшую версию ObjectPath от Github.Я исправил некоторые проблемы с нулевым сравнением минуту назад.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...