Запрос JSONPath возвращает ключи с тем же именем из вложенных объектов, когда мне нужен только родительский объект

В настоящее время я работаю с Pentaho Kettle для некоторых заданий ETL, и мне нужно интегрировать канал JSON, что означает, что мне нужно использовать JSONPath для сбора данных. По большей части он работает хорошо, за исключением того, что некоторые данные JSON представляют собой вложенные объекты с одинаковым именем поля как в родительском, так и в дочернем.

Пример JSON:

[
  {
    "Key": "5e59d536-2e3c-487c-bff1-efd0a706532f",
    "Product": {
      "Name": "Some Product",
      "LastUpdated": "2013-08-23T12:10:25.454",
    },
    "Reviewer": {
      "Email": "[email protected]",
      "LastUpdated": "2013-08-23T12:10:25.454",
    },
    "LastUpdated": "2013-08-23T12:10:25.407",
  },
  {
    "Key": "f3ae6a4b-1a20-4a9a-9a8e-2de5949c4493",
    "Product": {
      "Name": "Some Product",
      "LastUpdated": "2013-08-23T12:10:51.896",
    },
    "Reviewer": {
      "Email": "[email protected]",
      "LastUpdated": "2013-08-23T12:10:51.896",
    },
    "LastUpdated": "2013-08-23T12:10:51.896",
  },
  {
    "Key": "de01c358-6c74-473c-8cd4-a44cf50132df",
    "Product": {
      "Name": "Some Product",
      "LastUpdated": "2013-08-26T10:30:13.617",
    },
    "Reviewer": {
      "Email": "[email protected]",
      "LastUpdated": "2013-08-26T10:30:13.617",
    },
    "LastUpdated": "2013-08-26T10:30:13.601",
    },
  },
  {
    "Key": "af04e48a-3ce8-4227-a00a-14483ca75058",
    "Product": {
      "Name": "Some Product",
      "LastUpdated": "2013-08-26T10:31:20.573",
    },
    "Reviewer": {
      "Email": "[email protected]",
      "LastUpdated": "2013-08-26T10:31:20.573",
    },
    "LastUpdated": "2013-08-26T10:31:20.573",
  },
  {
    "Key": "d1a787bb-37d2-4ea9-84fd-5a3d454b9127",
    "Product": {
      "Name": "Some Product",
      "LastUpdated": "2013-08-27T11:59:56.777",
    },
    "Reviewer": {
      "Email": "[email protected]",
      "LastUpdated": "2013-08-27T11:59:56.777",
    },
    "LastUpdated": "2013-08-27T11:59:56.73",
  },
  {
    "Key": "d8646319-af27-464f-bd50-d61e035800c6",
    "Product": {
      "Name": "Some Product",
      "LastUpdated": "2013-08-27T19:43:06.928",
    },
    "Reviewer": {
      "Email": "[email protected]",
      "LastUpdated": "2013-08-27T19:43:06.928",
    },
    "LastUpdated": "2013-08-27T19:43:06.866",
  },
]

Как видите, родительский объект и его дочерние объекты «Продукт» и «Проверяющий» имеют поля «LastUpdated». Я пытаюсь получить только LastUpdated родительского объекта, но использую:

$..LastUpdated

возвращает по порядку родительский LastUpdated, Product LastUpdated, затем Reviewer LastUpdated.

РЕЗУЛЬТАТЫ:

[
   "2013-08-23T12:10:25.407",
   "2013-08-23T12:10:25.454",
   "2013-08-23T12:10:25.454",
   "2013-08-23T12:10:51.896",
   "2013-08-23T12:10:51.896",
   "2013-08-23T12:10:51.896",
   "2013-08-26T10:30:13.601",
   "2013-08-26T10:30:13.617",
   "2013-08-26T10:30:13.617",
   "2013-08-26T10:31:20.573",
   "2013-08-26T10:31:20.573",
   "2013-08-26T10:31:20.573",
   "2013-08-27T11:59:56.73",
   "2013-08-27T11:59:56.777",
   "2013-08-27T11:59:56.777",
   "2013-08-27T19:43:06.866",
   "2013-08-27T19:43:06.928",
   "2013-08-27T19:43:06.928"
]

ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ:

[
   "2013-08-23T12:10:25.407",
   "2013-08-23T12:10:51.896",
   "2013-08-26T10:30:13.601",
   "2013-08-26T10:31:20.573",
   "2013-08-27T11:59:56.73",
   "2013-08-27T19:43:06.866",
]

Есть ли запрос, который я могу использовать только для получения полей LastUpdated родительских объектов?


person Chris Doggett    schedule 28.08.2013    source источник


Ответы (1)


Наконец разобрался:

$[*].LastUpdated -> only the parents
$[*].Product.LastUpdated -> only the product
$[*].Reviewer.LastUpdated -> only the reviewer
person Chris Doggett    schedule 28.08.2013
comment
Как вам удалось заставить это работать? Все, что я получаю, это то, что мы не можем найти никаких данных с path [. Единственное, что работает, - это $ .. fieldName, но это доставляет мне те же проблемы, что и вы - он извлекает данные из вложенных элементов. - person lukfi; 19.05.2015
comment
@lukfi: Честно говоря, не помню. В прошлом году я потратил несколько месяцев на то, чтобы полностью переписать свой ETL на Python3 и полностью отказаться от Kettle. Извините, я ничем не могу вам помочь. Что определенно помогло мне разобраться в то время, так это поиск в Интернете приличного тестера JSONPath. - person Chris Doggett; 20.05.2015
comment
Спасибо за ответ, Крис. Я не знал, что существуют тестеры JsonPath. Теперь я вижу, что ваш ответ правильный, но Kettle 5.1 не работает. Вы случайно не помните, какую версию Kettle вы использовали? - person lukfi; 20.05.2015
comment
...неважно. Оставьте всякую надежду, входящие сюда! Она сломалась годами, и Пентахо отказывается ее ремонтировать. jira.pentaho.com/browse/PDI-5143 - person lukfi; 20.05.2015