web-dev-qa-db-fra.com

Comment filtrer par chaîne 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 souhaite lui appliquer JSONPath pour renvoyer uniquement les résultats avec une catégorie "Politicien". D'après ce que j'ai lu, il me semble que je dois faire:

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

mais selon le outil de test j'ai trouvé, cela ne fonctionne pas. J'ai trouvé ne autre question qui suggère que je devrais utiliser "eq" au lieu de "==", mais cela ne fonctionne pas non plus. Qu'est-ce que je me trompe ici?

48
Alastair

Votre requête semble correcte, et vos données et votre requête fonctionnent pour moi avec this JsonPath analyseur. Consultez également les exemples de requêtes sur cette page pour plus d'exemples de prédicats.

L'outil de test que vous utilisez semble défectueux. Même les exemples du site JsonPath renvoient des résultats incorrects:

par exemple, é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 pour l’expression: $.store.book[?(@.length-1)].title, l’outil renvoie une liste de tous les titres .

28
pb2q

Déposez les citations:

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

Voir aussi ceci page Exemple de chemin Json

5
durandal

Je n'ai pas trouvé la syntaxe de filtre correcte pour jsonpath afin d'extraire une valeur d'une paire nom-valeur en json.

Voici la syntaxe et un exemple de document Twitter abrégé ci-dessous.

Ce site était utile pour tester:

L'expression de filtre jsonpath:

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

Document de test:

{
  "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"
    } ]
  } ]
}
4
Joe Meree

'' Alastair, vous pouvez utiliser cette librairie et cet 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, ça va ressembler à ça:

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

Les outils de test du navigateur, bien que pratiques, peuvent être un peu trompeurs. Considérer:

{
  "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>

C'est revenu vrai. Je recommande d'écrire un test unitaire simple pour vérifier plutôt que de compter sur les outils de test du navigateur.

0
Jeremy Deane