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?

40
demandé sur Community 2012-09-25 19:15:04

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.

21
répondu pb2q 2012-09-25 20:29:34

supprimer les guillemets:

List<Object> bugs = JsonPath.read(githubIssues, "$..labels[?(@.name==bug)]");

Voir Aussi ce exemple de chemin Json page

5
répondu durandal 2015-03-09 02:26:04

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"
    } ]
  } ]
}
3
répondu Joe Meree 2015-04-03 03:38:01

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.

0
répondu Jeremy Deane 2015-09-11 15:11:50

" 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
0
répondu Hakan Bilgin 2016-03-25 10:08:16