【问题标题】:Python jsonpath Filter ExpressionPython jsonpath 过滤器表达式
【发布时间】:2012-09-09 21:48:35
【问题描述】:

背景:

我在 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'}
]}

传感器列表实际上将包含许多包含传感器信息的字典。

问题:

我正在尝试使用 jsonpath 查询列表,以向我返回具有 sensor_type=='Temperature' 的传感器字典子集,但我收到了 'False' 返回(不匹配)。这是我的 jsonpath 表达式:

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

当我删除过滤器表达式并仅使用"$.sensor.*" 时,我会得到所有传感器的列表,因此我确定问题出在过滤器表达式中。

我已经扫描了多个站点/帖子以获取示例,但我似乎找不到任何特定于 Python 的内容(Javascript 和 PHP 似乎更突出)。有人可以提供一些指导吗?

【问题讨论】:

    标签: python jsonpath


    【解决方案1】:

    以下表达式可以满足您的需要(注意属性是如何指定的):

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

    【讨论】:

    • 实际上,最终对我有用的是删除“。”在@.['sensor_type']。显然它只是@['sensor_type']。
    • 这两种形式可能都有效。
    • 你在哪里找到“jsonpath”,这里似乎没有链接pypi.python.org/simple/jsonpath?
    • pypi.python.org/pypi/jsonpath。虽然它似乎没有维护:(...你最好寻找一个替代品。
    【解决方案2】:

    我正在使用jsonpath-ng,它似乎处于活动状态(截至 23.11.20),我根据 Pedro 的 jsonpath 表达式提供解决方案:

    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)
    

    输出:

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

    注意:除了项目主页上提供的基本文档外,我还在 tests 中找到了其他信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-03
      • 2011-01-01
      • 1970-01-01
      • 2014-02-27
      • 2016-10-12
      • 2019-07-04
      相关资源
      最近更新 更多