【问题标题】:jq query json key based on key value filterjq基于键值过滤器查询json键
【发布时间】:2018-08-15 05:47:25
【问题描述】:

我有一个带有键的 json 文件,值是带有键值对的 json。我想根据内部键值对过滤和提取键。非常感谢任何帮助

示例 json 数据:

{
    "key1": {
      "filterkey": "filtervalue",
      "key1": "value1"
    },
    "key2": {
      "key1": "value1",
      "key2": "value2"
    }
}
  • 过滤器:“filterkey”:“filtervalue”
  • 预期输出:“key1”

【问题讨论】:

  • 您是否需要它在任意深度的 json 或仅在顶层工作?你真的期待"key1" 还是["key1"],因为可能存在不止一个键?
  • @M.Rau json 深度总是一样的......只是会有更多的键
  • 请通过避免重复“key1”来增强示例。

标签: python json jq


【解决方案1】:

如果您的输入 json 是稳定的,并且您不需要控制任何边缘情况(任意深度、顶级类型不匹配,例如 "key1": "not a dict"),那么这可以解决您的问题:

ret = []
for k, v in js.items():
    if v.get("filterkey") == "filtervalue":
        ret.append(k)

【讨论】:

    【解决方案2】:

    运行 sn-p 查看输出:

        var jsonObject = {
                            "key1": {
                                "filterkey": "filtervalue",
                                "key1": "value1"
                            },
                            "key2": {
                                "key1": "value1",
                                "key2": "value2"
                            }
                        };
        function filterKey(jsonObject, keySearch, valueSearch) {
            var result = null;
            for (const key in jsonObject) {
                if (jsonObject.hasOwnProperty(key) && 
                    jsonObject[key][keySearch] !== undefined && 
                    jsonObject[key][keySearch] === valueSearch) {
                    result = key;
                    break;
                }
            }
            return result;
        }
    
        alert(filterKey(jsonObject, 'filterkey', 'filtervalue'));

    【讨论】:

      【解决方案3】:
      jq '.[] | select( .filterkey == "filtervalue") | to_entries[1]| .key'   sample.json
      

      通过filterkey选择,将对象变成键值整体,然后取第二个条目的键。输出是:

      "key1"
      

      【讨论】:

        【解决方案4】:

        在示例中,“key1”出现了多次,但看起来您想要最外层的键名。如果是这种情况,那么使用to_entries 是一个不错的选择,例如:

        to_entries[]
        | if .value.filterkey == "filtervalue" then .key else empty end
        

        或等效:

        to_entries[]
        | select(.value.filterkey == "filtervalue" )
        | .key
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-16
          • 1970-01-01
          • 2022-11-15
          • 2010-11-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多