AJ.
AJ.

Reputation: 28174

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?

Upvotes: 4

Views: 11322

Answers (2)

Robert Lujo
Robert Lujo

Reputation: 16371

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.

Upvotes: 7

Pedro Romano
Pedro Romano

Reputation: 11203

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

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

Upvotes: 6

Related Questions