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
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.
- 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.
- 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).
- 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.
- R: Expressões simples são rápidas. Pesquisas recursivas complexas (como
$..nameP: Como lidar com valores nulos ou campos ausentes? - R: Usar
?()Devolver apenas pedidos com campo de valor. $.data.orders[?(@.amount)]
Exemplo completoDados 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.上实时测试你的表达式。