2015-05-24 13 views
5

Ecco la mia JSON:In Python, utilizzando jsonpath-rw per ottenere valori di attributo specifico (JSON/dict)

{ 
    'test': [ 
     { "id": "1", "description": "Test 1" }, 
     { "id": "2", "description": "Test 2" } 
    ] 
} 

Sto cercando di ottenere il valore per id dove descrizione è " Test 1 ".

ho trovato il seguente esempio sulla pagina JsonPath:

$..book[?(@.price<10)] 

Quando si cerca di analizzare la seguente espressione jsonxpath:

parse('$..test[?(@.description="Test 1")].id') 

ottengo il seguente errore:

jsonpath_rw.lexer.JsonPathLexerError: Error on line 1, col 7: Unexpected character: ? 

Che cosa sto facendo di sbagliato? In alternativa, c'è un modo migliore per farlo?

+3

Stranamente, guardando il [codice di lexer] (https://github.com/kennknowles/python-jsonpath-rw/blob/master/jsonpath_rw/lexer.py), jsonpath-rw no sembra supportare il meccanismo di filtro '? (booleano)'. – voithos

risposta

7

Sembra che jsonpath-rw non supporti questa funzione. Forse consideri un'altra biblioteca? ObjectPath sembra essere molto promettente:

>>> import objectpath 
>>> json_obj = { ... } # This has to be pre-parsed 
>>> tree = objectpath.Tree(json_obj) 
>>> ids = tree.execute('$..test[@.description is "Test 1"].id') 
>>> print list(ids) 
["1"] 

non abbastanza seguire la sintassi JsonPath esattamente, ma è molto simile, almeno da un sondaggio superficiale. Documentation è anche disponibile.

Ovviamente, se il tuo JSON sarà sempre nella stessa forma (cioè non dovrai occuparti di oggetti figlio mancanti, ecc.), Allora potresti facilmente fare la stessa query usando una lista di comprensione, o qualcosa di simile .

json = { ... } 
ids = [t['id'] for t in json['test'] if t['description'] == 'Test 1'] 
+1

Ricorda che l'operatore '..' (discesa ricorsiva/ricerca profonda) è molto lento. Usa '.' se sei sicuro che il test sia nella radice del documento e solo nella radice del documento. –

Problemi correlati