JSON Path Transformer V2

Descubra mais sobre o componente JSON Path Transformer V2 e saiba como usá-lo na Digibee Integration Platform.

O componente JSON Path Transformer V2 tem a função de receber qualquer entrada válida em JSON e realizar filtros e extrações de dados a partir de uma expressão. Esta versão do componente também suporta expressões Double Braces.

JSONPath é uma linguagem de consulta para JSON com recursos semelhantes ao XPath. Essa expressão é normalmente utilizada para selecionar e extrair os valores de propriedade de um objeto JSON. Leia mais na documentação sobre JSONPath.

Parâmetros

Dê uma olhada nas opções de configuração do componente. Parâmetros suportados por expressões Double Braces estão marcados com (DB).

Parâmetro
Descrição
Valor padrão
Tipo de dado

JSON Path (DB)

Serve para indicar qual expressão será utilizada no momento do processamento do JSON. É um parâmetro obrigatório e deve ser configurado de acordo com o que você deseja processar. Uma expressão Double Braces pode ser utilizada para obter o valor JSON Path dinamicamente da entrada.

$.store.books[?(@.title=='IT')]

String

Fail On Error

Se a opção estiver habilitada, a execução do pipeline com erro será interrompida; do contrário, a execução do pipeline continua, mas o resultado vai mostrar um valor falso para a propriedade "success".

False

Booleano

Conheça as demais opções para a declaração JSONPath:

  • $: raiz do objeto ou vetor.

  • .property: seleciona uma propriedade específica no objeto relacionado.

  • ['property']: seleciona uma propriedade específica no objeto relacionado. Coloque apenas aspas simples ao redor do nome da propriedade. Dica: considere essa instrução caso o nome da propriedade contenha caracteres especiais, assim como espaços, ou caso comece com caracteres diferentes de A..Za..z_.

  • [n]: seleciona o elemento n de um vetor. Os índices começam com 0.

  • [index1,index2,…]: seleciona elementos do vetor com índices específicos e retorna uma lista.

  • ..property: recursiva descendente. Busca um nome de propriedade de maneira decrescente e retorna um vetor de todos os valores com esse nome de propriedade. Sempre retorna uma lista, mesmo que apenas 1 propriedade seja encontrada.

  • : o coringa seleciona todos os elementos em um objeto ou vetor, qualquer que sejam os seus nomes ou índices. Por exemplo, “endereço.” significa todas as propriedades do objeto endereço, enquanto “livro[*]” significa todos os itens de um vetor de livro.

  • [input:output] / [input:]: seleciona elementos de um vetor de entrada e até, porém não necessariamente, um vetor de saída. Se a saída é omitida, selecione todos os vetores até o final do vetor. Uma lista é retornada.

  • [:n]: seleciona os primeiros n elementos do vetor. Uma lista é retornada.

  • [-n:]: seleciona os últimos n elementos do vetor. Uma lista é retornada.

  • [?(expression)]: expressão de filtro. Seleciona todos os elementos em um objeto ou vetor que coincidem com o filtro especificado. Uma lista é retornada.

  • [(expression)]: expressões de script podem ser utilizadas no lugar de nomes explícitos de propriedades ou índices. Por exemplo, [(@.tamanho-1)], que seleciona o último item de um vetor. Aqui, tamanho se refere ao tamanho do vetor em questão mais do que um arquivo JSON nomeado "tamanho".

  • @: utilizado em expressões de filtro para fazer referência ao nó atual que está sendo processado.

  • ==: igual a .1 e '1' são considerados o mesmo resultado. Valores de string devem ser anexados em aspas simples (e não em aspas): [?(@.cor=='vermelho')].

  • !=: diferente de. Valores de string devem ser anexados em aspas simples.

  • >: maior que.

  • >=: maior ou igual a.

  • <: menor que.

  • <=: menor ou igual a.

  • =~: compatível com uma RedEx Java Script regular. Por exemplo, [?(@.descricao =~ /gato.*/i)] casa itens cuja descrição começa com gato (ignora maiúsculas e minúsculas).

  • !: utilizado para negar um filtro. Por exemplo, [?(!@.isbn)] casa itens que não possuem a propriedade isbn.

  • &&: operador lógico E. Exemplo: [?(@.categoria=='ficcao' && @.preco < 10)]

  • ||: operador lógico OU. Exemplo: [?(@.categoria=='ficcao' || @.preco < 10)]

Fluxo de mensagens

Entrada

Para demonstrar a funcionalidade desse componente, você precisa configurar um JSON de entrada em um pipeline com o JSON Path Transformer V2. Após adicioná-lo ao pipeline, é preciso configurar a expressão JSONPath como $.address..[?(@.postalCode == '02375')].streetAddress ou o exemplo não vai funcionar.

A intenção deste exemplo é filtrar os endereços de entrada por apenas um único código postal e retornar apenas a rua do endereço. Veja:

{
  "address": [
      {
          "streetAddress": "Bogisich Terrace",
          "city": "New Napoleonville",
          "postalCode": "02375"
},
      {
          "streetAddress": "Schuster Spring",
          "city": "Lake Loraineborough",
          "postalCode": "68244"
      },
      {
          "streetAddress": "Hettinger Ports",
          "city": "Dorcaschester",
          "postalCode": "86760"
      },
      {
          "streetAddress": "Rippin Mount",
          "city": "Lake Bernadettetown",
          "postalCode": "57163"
      },
      {
          "streetAddress": "Gutmann Village",
          "city": "West Darlene",
          "postalCode": "00064"
      }
  ]
}

Saída

A estrutura será o JSON filtrado pela especificação JSONPath.

[  
   "Bogisich Terrace"
]

JSON Path Transformer V2 em ação

Veja abaixo como o componente se comporta em determinadas situações e a sua respectiva configuração em cada caso.

Retornar apenas os autores dos livros com um analisador descendente recursivo

Neste exemplo, você verá apenas os autores de um array com livros dentro de uma loja. A configuração de expressão do componente deve ser $..author.

Entrada

{
  "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
 }
}
}

Saída

[
  "Nigel Rees",
  "Evelyn Waugh",
  "Herman Melville",
  "J. R. R. Tolkien"
]
[
  "Nigel Rees",
  "Evelyn Waugh",
  "Herman Melville",
  "J. R. R. Tolkien"
]

Retornar apenas produtos com menos que um valor limite especificado

Neste exemplo, você verá apenas os produtos de um array com preço menor que R$3.300,00. A configuração de expressão do componente deve ser $..[?(@.price<3300)].

Entrada

{
  "data": [
      {
          "product": "Samsung 4k Q60T 55",
          "price": 3278.99
      },
      {
          "product": "Samsung galaxy S20 128GB",
          "price": 3698.99
      }
  ]
}

Saída

[
  {
      "product": "Samsung 4k Q60T 55",
      "price": 3278.99
  }
]

Informando uma expressão inválida com a configuração "Fail On Error: false"

Com este exemplo você pode configurar o componente com Fail On Error como “false” e utilizar a expressão $.

Com essas configurações, o resultado será uma mensagem de erro e com a propriedade "success": false.

Entrada

{
  "data": [
      {
          "product": "Samsung 4k Q60T 55",
          "price": 3278.99
      },
      {
          "product": "Samsung galaxy S20 128GB",
          "price": 3698.99
      }
  ]
}

Saída

{
  "success": false,
  "error": "The Json Path transformation has failed. Please check your specification: $.",
  "exception": "com.jayway.jsonpath.InvalidPathException: Path must not end with a '.' or '..'"
}

Informando uma expressão inválida com a configuração "Fail On Error: true"

Com este exemplo você pode configurar o componente com Fail On Error como “true” e utilizar a expressão $.

Com essas configurações, o resultado será uma mensagem de erro e a execução será interrompida imediatamente.

Entrada

{
  "data": [
      {
          "product": "Samsung 4k Q60T 55",
          "price": 3278.99
      },
      {
          "product": "Samsung galaxy S20 128GB",
          "price": 3698.99
      }
  ]
}

Saída

{
  "timestamp": 1603900161240,
  "error": "Json Path Transformer has failed",
  "code": 500
}

Returnando apenas resultados de erro de uma entrada array

Neste exemplo, somente os resultados de erro são extraídos de um array de execuções. A configuração da expressão do componente deve ser $..[?(@.error)].

Entrada

[
  {
    "executionId": "execution-1",
    "result": {
      "error": "Error 404",
      "code": 404,
      "statusMessage": "Not Found"
    }
  },
  {
    "executionId": "execution-2",
    "result": {
      "error": "Error 500",
      "code": 500,
      "statusMessage": "Internal Server Error"
    }
  },
  {
    "executionId": "execution-3",
    "result": {
      "code": 200,
      "statusMessage": "Success"
    }
  }
]

Saída

[
   {
      "error":"Error 404",
      "code":404,
      "statusMessage":"Not Found"
   },
   {
      "error":"Error 500",
      "code":500,
      "statusMessage":"Internal Server Error"
   }
]

Obter a expressão JSON Path dinamicamente da entrada

Neste exemplo, o JSON Path é obtido dinamicamente da entrada usando uma expressão Double Braces. A configuração da expressão do componente deve ser {{ message.jsonPath }}.

Entrada

{
  "jsonPath": "$.store.books[?(@.title=='IT')]",
  "store":{
    "books":[
      {
        "author":"Stephen King",
        "title":"IT"
      },
      {
        "author":"Agatha Christie",
        "title":"The ABC Murders"
      }
    ]
  }
}

Saída

[
   {
      "author":"Stephen King",
      "title":"IT"
   }
]

Atualizado