Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python jsonpath Filter Expression

Background:

I have the following example data structure in JSON:

{'sensor' : [
    {'assertions_enabled': 'ucr+',
     'deassertions_enabled': 'ucr+',
     'entity_id': '7.0',
     'lower_critical': 'na',
     'lower_non_critical': 'na',
     'lower_non_recoverable': 'na',
     'reading_type': 'analog',
     'sensor_id': 'SR5680 TEMP (0x5d)',
     'sensor_reading': {'confidence_interval': '0.500',
                    'units': 'degrees C',
                    'value': '42'},
     'sensor_type': 'Temperature',
     'status': 'ok',
     'upper_critical': '59.000',
     'upper_non_critical': 'na',
     'upper_non_recoverable': 'na'}
]}

The sensor list will actually contain many of these dicts containing sensor info.

Problem:

I'm trying to query the list using jsonpath to return me a subset of sensor dicts that have sensor_type=='Temperature' but I'm getting 'False' returned (no match). Here's my jsonpath expression:

results = jsonpath.jsonpath(ipmi_node, "$.sensor[?(@.['sensor_type']=='Temperature')]")

When I remove the filter expression and just use "$.sensor.*" I get a list of all sensors, so I'm sure the problem is in the filter expression.

I've scanned multiple sites/posts for examples and I can't seem to find anything specific to Python (Javascript and PHP seem to be more prominent). Could anyone offer some guidance please?

like image 756
AJ. Avatar asked Sep 17 '25 17:09

AJ.


2 Answers

I am using jsonpath-ng which seems to be active (as of 23.11.20) and I provide solution based on to Pedro's jsonpath expression:

data = {
    'sensor' : [
        {'sensor_type': 'Temperature', 'id': '1'},
        {'sensor_type': 'Humidity'   , 'id': '2'},
        {'sensor_type': 'Temperature', 'id': '3'},
        {'sensor_type': 'Density'    , 'id': '4'}
    ]} 

from jsonpath_ng.ext import parser
for match in parser.parse("$.sensor[?(@.sensor_type=='Temperature')]").find(data):
    print(match.value)

Output:

{'sensor_type': 'Temperature', 'id': '1'}
{'sensor_type': 'Temperature', 'id': '3'}

NOTE: besides basic documentation provided on project's homepage I found additional information in tests.

like image 126
Robert Lujo Avatar answered Sep 20 '25 07:09

Robert Lujo


The following expression does what you need (notice how the attribute is specified):

jsonpath.jsonpath(impi_node, "$.sensor[?(@.sensor_type=='Temperature')]")
like image 20
Pedro Romano Avatar answered Sep 20 '25 07:09

Pedro Romano