Come filtro da stringa in JSONPath?

Ho una risposta JSON da Facebook API che assomiglia a questo:

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

Voglio applicare JSONPath per restituire solo i risultati con una categoria del “Politico”. Da quello che ho letto, sembra che ho bisogno di fare:

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

ma secondo il strumento di test ho trovato, questo non funziona. Ho trovato un’altra domanda che suggerisce che dovrei usare “eq” invece di “==”, ma che non funziona. Quello che ho sempre sbagliato?

  • Upvote per esilarante campione di dati 🙂
  • ci crediate o no, i dati reali…
  • Credo che questo sia perché cosa c’è nella parentesi tonda è in realtà dipende il motore di scripting che si utilizza per valutare. Se si utilizza JavaScript vorrei aspettare di lavoro, tuttavia, non tutti i JsonPath implementazioni potrebbero utilizzare la stessa o qualsiasi linguaggio di scripting. Mi dispiace sono molto in ritardo per rispondere a questo.
InformationsquelleAutor Alastair | 2012-09-25

 

5 Replies
  1. 28

    Query guarda bene, e i tuoi dati e query di lavoro per me utilizzando questo JsonPath parser. Vedi anche l’esempio di query su questa pagina per ulteriori predicato esempi.

    Lo strumento di test che si sta utilizzando sembra difettoso. Anche gli esempi da JsonPath sito restituire risultati non corretti:

    ad esempio, data:

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

    E l’espressione: $.store.book[?(@.length-1)].title, lo strumento restituisce un elenco di tutti titoli.

    • Grazie. Molto frustrante, ma probabilmente è colpa mia per essere pigri e non in cerca di un altro strumento.
    • $.store.book[*].title fornirà lo stesso risultato.
  2. 4

    Non ho trovato di trovare il corretto jsonpath sintassi del filtro per estrarre un valore da una coppia nome-valore in json.

    Ecco la sintassi e un breve esempio di twitter documento qui sotto.

    Questo sito è stato utile per il test:

    Il jsonpath espressione di filtro:

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

    Documento di prova:

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

    Browser, strumenti di test, mentre comoda può essere un po ‘ ingannevole. Considerare:

    {
      "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 maggior parte degli strumenti restituito questo come false:

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

    Ma quando ho eseguito contro

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

    È tornato il vero. Mi consiglia di scrivere una semplice unità di test per verificare piuttosto che fare affidamento sul browser, strumenti di test.

    • Ciao Jeremy, se si nota nel tuo JSON il status chiave è a diversi livelli della gerarchia. Come posso cercare tutte status attributo qui in modo dinamico ?
  4. 0

    “Alastair, è possibile utilizzare questo lib e strumento; DefiantJS. Esso consente di query XPath su strutture JSON e si può testare e convalidare questo XPath:

    //data[category="Politician"]

    DefiantJS si estende l’oggetto globale con il metodo di “ricerca”, che a sua volta restituisce un array con le partite. In Javascript, sarà simile a questa:

    var person = JSON.search(json_data, "//people[category='Politician']");
    console.log( person[0].name );
    //Barack Obama
    • Grazie per la regia di me DefiantJS. Davvero un bel progetto.

Lascia un commento