jq基于键值过滤器查询json键

时间:2018-08-15 05:47:26

标签: python json jq

我有一个带键的json文件,值是带键值对的json。我想根据内部键值对过滤并提取键。任何帮助将不胜感激

示例json数据:

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

4 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

运行代码片段以查看输出:

    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'));

答案 2 :(得分:0)

jq '.[] | select( .filterkey == "filtervalue") | to_entries[1]| .key'   sample.json

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

"key1"

答案 3 :(得分:0)

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

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

或等效地:

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