我有一个带键的json文件,值是带键值对的json。我想根据内部键值对过滤并提取键。任何帮助将不胜感激
示例json数据:
{
"key1": {
"filterkey": "filtervalue",
"key1": "value1"
},
"key2": {
"key1": "value1",
"key2": "value2"
}
}
答案 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