Vrais problèmes rencontrés
{
"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"}
]
}
}
Je dois extraire :- Nom d'utilisateur
- Toutes les adresses e-mail
- Montant de la commande payée
Corriger l'expression JSONPath
1. Extraire le nom d'utilisateur
$.data.user.profile.name
Résultat :"张三"
2. Extraire toutes les adresses e-mail
$.data.user.profile.contacts[?(@.type=='email')].value
结果:["[email protected]"]
3. Extraire le montant des commandes payées
$.data.orders[?(@.status=='paid')].amount
结果:[99.99]
4. Extrayez tous les ID et montants de commande
$.data.orders[*].[id,amount]
结果:[[1,99.99],[2,199.99]]
Test sur Tools Obsession
OpenJSONPath Tester, collez la réponse API à gauche, saisissez l'expression à droite et cliquez sur "Test". L'outil affichera immédiatement les résultats correspondants pour vous aider à vérifier si l'expression est correcte.Erreurs JSONPath courantes
Erreur 1 : symbole oublié$Erreur 2 : l'index du tableau commence à 1
❌ data.user.name
✅ $.data.user.name
Erreur 3 : erreur de syntaxe de filtre
❌ $.data.orders[1] // 这是第二个元素
✅ $.data.orders[0] // 这才是第一个元素
Erreur 4 : recherche récursive surutilisée
❌ $.data.orders[?(@.status=paid)] // 单个等号
❌ $.data.orders[?(@.status==paid)] // 没有引号
✅ $.data.orders[?(@.status=='paid')] // 正确
Erreur 5 : mauvaise utilisation des guillemets
❌ $..name // 会找所有层级的 name,可能匹配太多
✅ $.data.user.profile.name // 明确路径更精确
Conseils pratiques
❌ $.data.orders[?(@.status=="paid")] // 双引号在某些解析器中会出错
✅ $.data.orders[?(@.status=='paid')] // 单引号更稳定
Astuce 1 : testez d'abord le chemin parent
Je n'en suis pas sûr la structure des données ? Testez d'abord le chemin parent :
Astuce 2 : Utilisez le découpage$.data // 确认能取到 data
$.data.user // 确认能取到 user
$.data.user.profile // 确认能取到 profile
Vous n'avez besoin que des 3 premières commandes ?
Astuce 3 : Obtenez le dernier élément$.data.orders[0:3]
Astuce 4 : Sélection multi-champs
$.data.orders[-1:]
Obtenez plusieurs champs en même temps :
Astuce 5 : Filtrage de conditions complexes$.data.orders[*].[id,status]
Le montant est supérieur à 100 et le statut est payé :
FAQ$.data.orders[?(@.amount>100 && @.status=='paid')]
Q : Quelle est la différence entre JSONPath et JSON ?
- A : JSON est le format de données et JSONPath est le langage de requête. Tout comme SQL est un langage de requête de base de données, JSONPath est un langage de requête JSON.
- A : Non. Pris en charge par la bibliothèque JsonPath de Java, la bibliothèque JSONPath-plus de JavaScript et la bibliothèque jsonpath-ng de Python. Assurez-vous que votre bibliothèque le prend en charge avant de l'utiliser.
- A : La syntaxe des différentes bibliothèques est légèrement différente. Tool Junkies utilise la syntaxe JSONPath standard et recommande d'utiliser la même bibliothèque dans votre code (telle que com.jayway.jsonpath de Java).
- A : JSONPath peut uniquement être lu, pas modifié. Pour le modifier, il doit d'abord être analysé en objet, puis sérialisé après modification.
- A : Les expressions simples sont rapides. Les recherches récursives complexes (telles que
$..nameQ : Comment gérer les valeurs nulles ou les champs manquants ? - A : Utiliser
?()Retourner uniquement les commandes avec un champ de montant. $.data.orders[?(@.amount)]
Exemple completDonnées de réponse API (version simplifiée) :
Extraire tous les noms de produits en stock :{
"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}
]
}
}
Besoin de traiter des données JSON complexes ? Testez vos expressions en temps réel sur $.data.products[?(@.inStock==true)].name
结果:["iPhone","iPad"]
JSONPath Tester pour les accros aux outils.上实时测试你的表达式。