Comment filtrer par string dans JSONPath?
j'ai une réponse JSON de L'API Facebook qui ressemble à ceci:
{
"data": [
{
"name": "Barack Obama",
"category": "Politician",
"id": "6815841748"
},
{
"name": "Barack Obama's Dead Fly",
"category": "Public figure",
"id": "92943557739"
}]
}
je veux appliquer JSONPath à elle pour ne retourner des résultats avec une catégorie de"politicien". D'après ce que j'ai lu, il semble que j'ai besoin de faire:
$.data[?(@.category=='Politician')]
mais selon le outil de test j'ai trouvé, cela ne fonctionne pas. J'ai trouvé une autre question qui suggère que je devrais utiliser "eq" au lieu de "==", mais cela ne fonctionne pas non plus. De quoi suis-je mal ici?
5 réponses
votre requête semble très bien, et vos données et requête fonctionnent pour moi en utilisant ce jsonpath parser. Voir aussi les requêtes d'exemple sur cette page pour plus d'exemples de prédicat.
L'outil de test que vous utilisez semble défectueux. Même les exemples du JsonPath site renvoient des résultats incorrects:
p.ex., étant donné:
{
"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
}
}
}
et l'expression: $.store.book[?(@.length-1)].title
, la tool retourne une liste de tous les titres.
supprimer les guillemets:
List<Object> bugs = JsonPath.read(githubIssues, "$..labels[?(@.name==bug)]");
Voir Aussi ce exemple de chemin Json page
Je n'ai pas trouvé la bonne syntaxe de filtre jsonpath pour extraire une valeur d'une paire nom-valeur dans json.
Voici la syntaxe et un exemple abrégé de document twitter ci-dessous.
ce site a été utile pour tester:
expression du filtre de jsonpath:
.events[0].attributes[?(@.name=='screen_name')].value
document D'essai:
{
"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"
} ]
} ]
}
les outils de test de navigateur bien que pratique peut être un peu trompeur. Prendre en considération:
{
"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 plupart des outils ont retourné ceci comme faux:
$[?(@.class==inpatient)]
mais quand j'ai exécuté contre
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>1.2.0</version>
</dependency>
il est retourné vrai. Je recommande l'écriture d'un test unitaire simple pour vérifier plutôt que de compter sur les outils de test de navigateur.
" Alastair, vous pouvez utiliser cette lib et outil; DefiantJS. Il active les requêtes XPath sur les structures JSON et vous pouvez tester et valider ce XPath:
//data[category="Politician"]
DefiantJS étend l'objet global avec la méthode "search", qui à son tour renvoie un tableau avec les correspondances. En Javascript, il ressemblera à ceci:
var person = JSON.search(json_data, "//people[category='Politician']");
console.log( person[0].name );
// Barack Obama