JSONPath en acción: forma correcta de extraer datos de respuestas API anidadas

Se encontraron problemas reales ``json { "code": 200, "data": { "user": { "profile": { "name": "Zhang San", "contacts": [ {"type": "email", "value": "zhangsan@example.

Problemas reales 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"}
    ]
  }
}
Necesito extraer:
  • Nombre de usuario
  • Todas las direcciones de correo electrónico
  • Cantidad del pedido pagado
¿Escribiendo bucles y juicios multicapa en código? No, use JSONPath directamente.

Expresión JSONPath correcta

1. Extraer nombre de usuario

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

2. Extraiga todas las direcciones de correo electrónico

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

3. Extraer el importe de los pedidos pagados

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

4. Extraiga todos los ID y montos de los pedidos

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

Prueba en Tools Obsession

AbrirJSONPath Tester, pegue la respuesta API a la izquierda, ingrese la expresión a la derecha y haga clic en "Probar". La herramienta mostrará inmediatamente los resultados coincidentes para ayudarle a verificar si la expresión es correcta.

Errores comunes de JSONPath

Error 1: Olvidé $símbolo

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

Error 2: El índice de matriz comienza en 1

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

Error 3: Error de sintaxis del filtro

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

Error 4: Búsqueda recursiva usada en exceso

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

Error 5: Uso incorrecto de comillas

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

Consejos prácticos

Consejo 1: Pruebe primero la ruta principal

No estoy seguro la estructura de datos? Pruebe primero la ruta principal:
$.data              // 确认能取到 data
$.data.user         // 确认能取到 user
$.data.user.profile // 确认能取到 profile

Consejo 2: utilice el corte

¿Solo necesita los primeros 3 pedidos?
$.data.orders[0:3]

Consejo 3: Obtenga el último elemento

$.data.orders[-1:]

Consejo 4: Selección de múltiples campos

Obtenga múltiples campos al mismo tiempo:
$.data.orders[*].[id,status]

Consejo 5: Filtrado de condiciones complejas

La cantidad es mayor que 100 y el estado es pagado:
$.data.orders[?(@.amount>100 && @.status=='paid')]

Preguntas frecuentes

  • P: ¿Cuál es la diferencia entre JSONPath y JSON?
R: JSON es el formato de datos y JSONPath es el lenguaje de consulta. Así como SQL es un lenguaje de consulta de bases de datos, JSONPath es un lenguaje de consulta JSON.
  • P: ¿Todas las bibliotecas JSON son compatibles con JSONPath?
R: No. Compatible con la biblioteca JsonPath de Java, la biblioteca JSONPath-plus de JavaScript y la biblioteca jsonpath-ng de Python. Asegúrese de que su biblioteca lo admita antes de usarlo.
  • P: ¿Por qué mi expresión funciona en la herramienta pero no en el código?
R: La sintaxis de diferentes bibliotecas es ligeramente diferente. Tool Junkies usa la sintaxis JSONPath estándar y recomienda usar la misma biblioteca en su código (como com.jayway.jsonpath de Java).
  • P: ¿Se pueden modificar los datos JSON?
R: JSONPath solo se puede leer, no modificar. Para modificarlo, primero debe analizarse en un objeto y luego serializarse después de la modificación.
  • P: ¿Cómo es el rendimiento?
R: Las expresiones simples son rápidas. Las búsquedas recursivas complejas (como $..name) pueden ser lentas en JSON grandes. Se recomienda aclarar el camino.
  • P: ¿Cómo lidiar con valores nulos o campos faltantes?
A: Uso ?() filtro:
$.data.orders[?(@.amount)]
Solo devolver pedidos con campo de importe.

Ejemplo completo

Datos de respuesta API (versión simplificada):
{
  "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}
    ]
  }
}
Extraiga todos los nombres de productos en stock:
$.data.products[?(@.inStock==true)].name
结果:["iPhone","iPad"]
¿Necesita procesar datos JSON complejos? Pruebe sus expresiones en tiempo real en JSONPath Tester para adictos a las herramientas.