JSONPath en action : manière correcte d'extraire les données des réponses API imbriquées

Problèmes réels rencontrés ``json { "code": 200, "data": { "user": { "profile": { "name": "Zhang San", "contacts": [ {"type": "email", "value": "zhangsan@example.

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
Écrire des boucles et des jugements multicouches dans le code ? Non, utilisez directement JSONPath.

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.
Q : Toutes les bibliothèques JSON prennent-elles en charge JSONPath ?
  • 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.
Q : Pourquoi mon expression fonctionne-t-elle dans l'outil mais pas dans le code ?
  • 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).
Q : Les données JSON peuvent-elles être modifiées ?
  • 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.
Q : Comment se déroule la performance ?
  • A : Les expressions simples sont rapides. Les recherches récursives complexes (telles que
) peuvent être lentes sur les gros JSON. Il est recommandé de clarifier le chemin. $..nameQ : Comment gérer les valeurs nulles ou les champs manquants ?
  • A : Utiliser
filtre : ?()Retourner uniquement les commandes avec un champ de montant.
$.data.orders[?(@.amount)]
Exemple complet

Donné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.上实时测试你的表达式。