通过您的输入,调用如下:
jq 'leaf_paths | join(".")'
生成:
"name"
"age"
"visits.2017-01-25"
"visits.2016-07-26"
"visits.2016-01-24"
如果你想包含"visits",请使用
paths
。如果你希望结果是一个JSON数组,请用方括号括起来:[ ... ]
如果你的输入可能包含数组,除非你使用的是jq 1.6或更高版本,否则你需要显式地将整数索引转换为字符串;另外,由于
leaf_paths
现在已被弃用,你可能想使用它的def。结果如下:
jq 'paths(scalars) | map(tostring) | join(".")'
allpaths
要包括空路径,您可以使用以下定义的allpaths
:
def allpaths:
def conditional_recurse(f): def r: ., (select(.!=null) | f | r); r;
path(conditional_recurse(.[]?)) | select(length > 0);
例子:
{"a": null, "b": false} | allpaths | join(".")
产生:
"a"
"b"
all_leaf_paths
假设 jq 版本为 1.5 或更高,我们可以通过遵循 builtin.jq 中使用的策略来获得 all_leaf_paths
,即通过添加以下定义:
def allpaths(f):
. as $in | allpaths | select(. as $p|$in|getpath($p)|f);
def isscalar:
. == null or . == true or . == false or type == "number" or type == "string";
def all_leaf_paths: allpaths(isscalar);
例子:
{"a": null, "b": false, "object":{"x":0} } | all_leaf_paths | join(".")
产生:
"a"
"b"
"object.x"
path
和leaf_paths
都忽略了值为null
或false
的字段。有什么办法可以包含它们吗? - nik