JSONPath em ação: maneira correta de extrair dados de respostas de API aninhadas

Problemas reais encontrados ``json { "code": 200, "data": { "user": { "profile": { "name": "Zhang San", "contacts": [ {"type": "email", "value": "zhangsan@example.

Problemas reais encontrados

{
  "code": 200,
  "data": {
    "user": {
      "profile": {
        "name": "张三",
        "contacts": [
          {"type": "email", "value": "[email protected]"},
          {"type": "phone", "value": "13800138000"}
        ]
      }
    },
    "orders": [
      {"id": 1, "amount": 99.99, "status": "paid"},
      {"id": 2, "amount": 199.99, "status": "pending"}
    ]
  }
}
Preciso extrair:
  • Nome de usuário
  • Todos os endereços de e-mail
  • Valor do pedido pago
Escrever loops e julgamentos multicamadas no código? Não, use JSONPath diretamente.

Expressão JSONPath correta

1. Extraia o nome de usuário

$.data.user.profile.name
Resultado:"张三"

2. Extraia todos os endereços de e-mail

$.data.user.profile.contacts[?(@.type=='email')].value
结果:["[email protected]"]

3. Extraia o valor dos pedidos pagos

$.data.orders[?(@.status=='paid')].amount
结果:[99.99]

4. Extraia todos os IDs de pedidos e valores

$.data.orders[*].[id,amount]
结果:[[1,99.99],[2,199.99]]

Teste em Tools Obsession

OpenJSONPath Tester, cole a resposta da API à esquerda, insira a expressão à direita e clique em "Test". A ferramenta exibirá imediatamente os resultados correspondentes para ajudá-lo a verificar se a expressão está correta.

Erros JSONPath comuns

Erro 1: Esqueci o símbolo $Erro 2: O índice do array começa em 1

❌ data.user.name
✅ $.data.user.name

Erro 3: Erro de sintaxe do filtro

❌ $.data.orders[1]  // 这是第二个元素
✅ $.data.orders[0]  // 这才是第一个元素

Erro 4: Pesquisa recursiva usada em excesso

❌ $.data.orders[?(@.status=paid)]    // 单个等号
❌ $.data.orders[?(@.status==paid)]   // 没有引号
✅ $.data.orders[?(@.status=='paid')] // 正确

Erro 5: Uso incorreto de aspas

❌ $..name  // 会找所有层级的 name,可能匹配太多
✅ $.data.user.profile.name  // 明确路径更精确

Dicas práticas

❌ $.data.orders[?(@.status=="paid")]  // 双引号在某些解析器中会出错
✅ $.data.orders[?(@.status=='paid')]  // 单引号更稳定

Dica 1: teste o caminho pai primeiro

Não tem certeza sobre a estrutura de dados? Teste o caminho pai primeiro:

Dica 2: Use fatiamento
$.data              // 确认能取到 data
$.data.user         // 确认能取到 user
$.data.user.profile // 确认能取到 profile

Precisa apenas dos 3 primeiros pedidos?

Dica 3: Obtenha o último elemento
$.data.orders[0:3]

Dica 4: Seleção de vários campos

$.data.orders[-1:]

Obtenha vários campos ao mesmo tempo:

Dica 5: Filtragem de condição complexa
$.data.orders[*].[id,status]

O valor é maior que 100 e o status é pago:

FAQ
$.data.orders[?(@.amount>100 && @.status=='paid')]

P: Qual é a diferença entre JSONPath e JSON?

  • R: JSON é o formato de dados e JSONPath é a linguagem de consulta. Assim como SQL é uma linguagem de consulta de banco de dados, JSONPath é uma linguagem de consulta JSON.
P: Todas as bibliotecas JSON suportam JSONPath?
  • R: Não. Compatível com a biblioteca JsonPath do Java, a biblioteca JSONPath-plus do JavaScript e a biblioteca jsonpath-ng do Python. Certifique-se de que sua biblioteca seja compatível antes de usá-lo.
P: Por que minha expressão funciona na ferramenta, mas não no código?
  • R: A sintaxe de diferentes bibliotecas é um pouco diferente. Tool Junkies usa sintaxe JSONPath padrão e recomenda usar a mesma biblioteca em seu código (como com.jayway.jsonpath do Java).
P: Os dados JSON podem ser modificados?
  • R: JSONPath só pode ser lido, não modificado. Para modificá-lo, ele precisa primeiro ser analisado em um objeto e depois serializado após a modificação.
P: Como está o desempenho?
  • R: Expressões simples são rápidas. Pesquisas recursivas complexas (como
) podem ser lentas em JSON grande. Recomenda-se esclarecer o caminho. $..nameP: Como lidar com valores nulos ou campos ausentes?
  • R: Usar
filter: ?()Devolver apenas pedidos com campo de valor.
$.data.orders[?(@.amount)]
Exemplo completo

Dados de resposta da API (versão simplificada):

Extraia todos os nomes de produtos em estoque:
{
  "data": {
    "products": [
      {"id": 1, "name": "iPhone", "price": 999, "inStock": true},
      {"id": 2, "name": "MacBook", "price": 1999, "inStock": false},
      {"id": 3, "name": "iPad", "price": 799, "inStock": true}
    ]
  }
}
Precisa processar dados JSON complexos? Teste suas expressões em tempo real no
$.data.products[?(@.inStock==true)].name
结果:["iPhone","iPad"]
JSONPath Tester para viciados em ferramentas.上实时测试你的表达式。