Extractor de JSON JMESPath
Tabela de conteúdos
intermediário - This article is part of a series.
O que é JMESPath ? #
JMESPath foi desenvolvido em 2012 por James Saryerwinnie, engenheiro da Mozilla Corporation, como uma alternativa à JSONPath para acessar e manipular dados em documentos JSON. A principal motivação pela criação de JMESPath era criar um ferramenta mais eficiente e flexível para acessar os dados em documentos JSON que são amplamente utilizados em aplicações web e mobile.
Em anos seguintes, JMESPath se tornou cada vez mais popular entre os desenvolvedores trabalhando com aplicações web e mobile que usam JSON como formato de troca de dados. Ele foi integrado em várias bibliotecas populares de Python e ferramentas, tornando-se um instrumento essencial para gerenciamento da infraestrutura na nuvem. Em 2017, JMESPath se tornou uma iniciativa aberta sob o projeto Python Projects. Desde então, foi adotado por várias bibliotecas e ferramentas de Python como AWS CLI e Terraform, sendo usado em diversas situações, desde análise de dados até integração de sistemas e automação de processos.
Agora, JMESPath continua sendo uma ferramenta popular para acessar e manipular dados em documentos JSON usados em aplicações web e mobile. É compatível com uma ampla variedade de linguagens de programação e frameworks, e é usado em várias contextos como gerenciamento de infraestrutura na nuvem, análise de dados e automação de processos.
O que é JSON? #
JSON (JavaScript Object Notation) é um formato de texto leve para eficiente troca de dados. É comumente usado para transmitir informações entre o aplicativo cliente e servidor ou para transmitir dados entre aplicações. JSON representa os dados em forma de objetos níveis e listas de objetos, usando uma sintaxe clara e fácil de ler baseada em chaves { } para definir objetos e parênteses [ ] para definir listas.
{
"nombre": "Ana",
"edad": 28,
"direccion": {
"calle": "Calle Principal",
"ciudad": "Ciudad de México",
"estado": "Ciudad de México",
"codigo_postal": "12345"
},
"intereses": ["leer","viajar","cocinar"]
}
Atributo | Descrição | Requerido |
---|---|---|
Nome | Descriptive name for this element that is displayed in the tree. | Não |
Aplicar a esta | Ótimo quando usado com mapeadores que podem gerar sub-samplerias, como sampler HTTP com recursos incorporados, leitor de e-mail ou controller de transação gerado por samples. Só para amostras principais: aplica-se apenas às amostras principais Só para amostras sub-amostras: aplica-se apenas às amostras sub-amostras Principais e sub-amostras: aplica-se a ambos Nome da variável usado na JMeter: extração será aplicada ao conteúdo da variável nomeada | Sim |
Nome da Variável Criada | O nome da variável do JMeter onde o resultado será armazenado. | Sim |
Expressões JMESPath | Consulta elemento usando a linguagem JMESPath. Pode retornar o resultado correspondente. 0: seleção aleatória -1: todos os resultados (padrão), nomeado como <nome da variável>_N onde N é de 1 a número de resultados X: extraia o _X_º resultado (onde X é maior que o número de matches, valor padrão) | Não |
Número Padrão de Matches (-1 para aleatório) | Se a consulta JMESPath tem muitos resultados, você pode escolher quais eles serão extraídos como variáveis: 0: seleção aleatória -1: todos os resultados (padrão), nomeado como <nome da variável>_N onde N é de 1 a número de resultados X: extraia o _X_º resultado (onde X é maior que o número de matches, valor padrão) | Não |
Valor Padrão | Valor padrão retornado quando não houver correspondência. Também retorna se o nó tiver valor nulo e opção fragmentação não selecionada. | Não |
{
"nombre": "Ana",
"edad": 28,
"direccion": {
"calle": "Calle Principal",
"ciudad": "Ciudad de México",
"estado": "Ciudad de México",
"codigo_postal": "12345"
},
"intereses": ["leer","viajar","cocinar"]
}
nombre //Ana
edad //28
direccion.calle //Calle Principal
direccion.codigo_postal //12345
direccion.ciudad //Ciudad de México
hobbies //["leer","viajar","cocinar"]
Quais outros exemplos de uso o JMESPath pode ter? #
Vamos considerar um exemplo mais complexo, como o seguinte:
[{
"name": "John Doe",
"age": 35,
"address": {
"street": "123 Main St",
"city": "Anytown",
"state": "WA"
},
"phoneNumbers": [
{
"type": "mobile",
"number": "555-551-1234"
},
{
"type": "home",
"number": "555-552-5678"
}
],
"email": "john.doe@example.com"
},{
"name": "Peter Doe",
"age": 34,
"address": {
"street": "123 Second St",
"city": "RacconCity",
"state": "TX"
},
"phoneNumbers": [
{
"type": "mobile",
"number": "555-553-1234"
},
{
"type": "home",
"number": "555-554-5678"
}
],
"email": "peter.doe@example.com"
},{
"name": "Rick Doe",
"age": 36,
"address": {
"street": "123 Third St",
"city": "Springfield",
"state": "NJ"
},
"phoneNumbers": [
{
"type": "mobile",
"number": "555-555-1234"
},
{
"type": "home",
"number": "555-556-5678"
}
],
"email": "rick.doe@example.com"
}]
For this example, suppose we want to evaluate and extract the following data:
Expression | Result |
---|---|
[*].name | returns all the names of the people. |
[0].phoneNumbers[0].number | returns the mobile phone number of the first phoneNumbers object. |
[?address.state=='WA'].name | returns the names of people whose state is WA. |
[*].phoneNumbers[?type=='mobile'].number | returns the mobile phone numbers of the phoneNumbers objects. |
length([*].phoneNumbers[?type=='home']) | returns the number of phoneNumbers objects of type home. |
sort_by(@, &age)[0].name | Returns the name of the youngest person. |
sort_by(@, &age)[-1].name | Returns the name of the oldest person. |
max_by(@, &age).name | Returns the name of the oldest person. |
min_by(@, &age).name | Returns the name of the youngest person. |
[*].name | sort(@) | Returns a list of people’s names in alphabetical order. |
sum([*].age) | Returns the sum of all ages. |
length([*].phoneNumbers) | Returns the number of phone numbers. |
join(', ', [*].phoneNumbers[].number) | Returns a string containing a list of all phone numbers. |
[?age >= `35` ] | Returns the names of people whose age is greater than 35. |
[?age >= `35`] | [?address.state == ‘WA’].name | Returns the names of people over the age of 35 who live in WA. |
[?contains(email,'john')].email | [0] | Returns the email address of the person whose name contains john. |
[?contains(name, 'Doe')].phoneNumbers[].number | [1] | Returns the second phone number of people whose name contains Doe. |
[?address.state=='TX'].address.city | sort(@) | [0] | Returns the name of the smallest city in Texas. |
[*].name | reverse(@) | Returns the names of people from oldest to youngest. |
[*].age | sum(@) | returns the sum of all ages. |
Para avaliar essas frases, recomendo usar um receptor Visualizar resultado árvore e utilizar a vista em Tester JSON JMESPath. Introduza a frase no campo Expressão JMESPath, então clique no botão Testar.
Conclusão #
JMESPath é um ferramenta muito poderosa para extrair valores, múltiplos valores, avaliação ou execução de funções dos valores para satisfazer uma ou mais condições, sempre lembre-se de praticar antes de desenvolver sua frase ou expressão. É bom verificar as condições com diferentes tipos de respostas para obter resultados conclusivos. Precisa praticar até a próxima!