query objetos filtros data buscar array json jsonpath

json - objetos - map filter javascript



Cómo filtrar por cadena en JSONPath? (5)

'''' Alastair, puedes usar esta lib y herramienta; DefiantJS. Permite consultas XPath en estructuras JSON y puede probar y validar este XPath:

//data[category="Politician"]

DefiantJS extiende el objeto global con el método "búsqueda", que a su vez devuelve una matriz con las coincidencias. En Javascript, se verá así:

var person = JSON.search(json_data, "//people[category=''Politician'']"); console.log( person[0].name ); // Barack Obama

Tengo una respuesta JSON de la API de Facebook que se ve así:

{ "data": [ { "name": "Barack Obama", "category": "Politician", "id": "6815841748" }, { "name": "Barack Obama''s Dead Fly", "category": "Public figure", "id": "92943557739" }] }

Deseo aplicar JSONPath para que solo devuelva resultados con una categoría de "Político". Por lo que he leído, parece que tengo que hacer:

$.data[?(@.category==''Politician'')]

pero de acuerdo con la herramienta de prueba que encontré, esto no funciona. Encontré otra pregunta que sugiere que debería usar "eq" en lugar de "==", pero eso tampoco funciona. ¿Qué me estoy equivocando aquí?


Las herramientas de prueba del navegador, aunque sean convenientes, pueden ser un poco engañosas. Considerar:

{ "resourceType": "Encounter", "id": "EMR56788", "text": { "status": "generated", "div": "Patient admitted with chest pains</div>" }, "status": "in-progress", "class": "inpatient", "patient": { "reference": "Patient/P12345", "display": "Roy Batty" } }

La mayoría de las herramientas devolvieron esto como falso:

$[?(@.class==inpatient)]

Pero cuando ejecuté contra

<dependency> <groupId>com.jayway.jsonpath</groupId> <artifactId>json-path</artifactId> <version>1.2.0</version> </dependency>

Volvió verdadero. Recomiendo escribir una prueba de unidad simple para verificar en lugar de confiar en las herramientas de prueba del navegador.


No encontré encontrar la sintaxis correcta del filtro jsonpath para extraer un valor de un par nombre-valor en json.

Aquí está la sintaxis y un documento abreviado de muestra de Twitter a continuación.

Este sitio fue útil para probar:

La expresión de filtro jsonpath:

.events[0].attributes[?(@.name==''screen_name'')].value

Documento de prueba:

{ "title" : "test twitter", "priority" : 5, "events" : [ { "eventId" : "150d3939-1bc4-4bcb-8f88-6153053a2c3e", "eventDate" : "2015-03-27T09:07:48-0500", "publisher" : "twitter", "type" : "tweet", "attributes" : [ { "name" : "filter_level", "value" : "low" }, { "name" : "screen_name", "value" : "_ziadin" }, { "name" : "followers_count", "value" : "406" } ] } ] }



Su consulta se ve bien, y sus datos y consultas funcionan para mí usando este analizador JsonPath . También vea las consultas de ejemplo en esa página para más ejemplos de predicados.

La herramienta de prueba que está utilizando parece defectuosa. Incluso los ejemplos del sitio JsonPath están arrojando resultados incorrectos:

por ejemplo, dado:

{ "store": { "book": [ { "category": "reference", "author": "Nigel Rees", "title": "Sayings of the Century", "price": 8.95 }, { "category": "fiction", "author": "Evelyn Waugh", "title": "Sword of Honour", "price": 12.99 }, { "category": "fiction", "author": "Herman Melville", "title": "Moby Dick", "isbn": "0-553-21311-3", "price": 8.99 }, { "category": "fiction", "author": "J. R. R. Tolkien", "title": "The Lord of the Rings", "isbn": "0-395-19395-8", "price": 22.99 } ], "bicycle": { "color": "red", "price": 19.95 } } }

Y la expresión: $.store.book[?(@.length-1)].title , la herramienta devuelve una lista de todos los títulos.