[英]Extract schema of nested JSON object
我们假设这是源json文件:
{
"name": "tom",
"age": 12,
"visits": {
"2017-01-25": 3,
"2016-07-26": 4,
"2016-01-24": 1
}
}
我想得到:
[
"age",
"name",
"visits.2017-01-25",
"visits.2016-07-26",
"visits.2016-01-24"
]
我可以使用: jq '. | keys' file.json
提取密钥jq '. | keys' file.json
jq '. | keys' file.json
jq '. | keys' file.json
,但这会跳过嵌套字段。 如何包括那些?
根据您的输入,调用:
jq 'leaf_paths | join(".")'
生产:
"name"
"age"
"visits.2017-01-25"
"visits.2016-07-26"
"visits.2016-01-24"
如果要包含“访问次数”,请使用paths
。 如果您希望将结果作为JSON数组,请使用方括号括起过滤器:[...]
如果您的输入可能包含数组,那么除非您使用的是jq 1.6或更高版本,否则您需要将整数索引显式转换为字符串; 此外,由于现在不推荐使用leaf_paths
,您可能希望使用其def。 结果:
jq 'paths(scalars) | map(tostring) | join(".")'
要包含null的路径,可以使用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"
假设jq版本1.5或更高版本,我们可以通过遵循all_leaf_paths
使用的策略来获取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"
这样做你想要的,但它不会返回数组中的数据,但它应该是一个简单的修改:
https://github.com/ilyash/show-struct
你也可以看看这个页面: https : //ilya-sher.org/2016/05/11/most-jq-you-will-ever-need/
前段时间,我编写了一个结构模式推理引擎,它生成了镜像所考虑的JSON文档的简单结构模式,例如,对于此处给出的示例JSON,推断的模式是:
{
"name": "string",
"age": "number",
"visits": {
"2017-01-25": "number",
"2016-07-26": "number",
"2016-01-24": "number"
}
}
这不完全是原始发布中请求的格式,但对于大型对象集合,它确实提供了有用的概述。
更重要的是,现在有一个补充验证器,用于检查JSON文档集合是否与结构模式匹配。 验证器检查用JESS (JSON扩展结构模式)编写的模式, JESS扩展结构模式是模式推理引擎生成的简单结构模式(SSS)的超集。
(我们的想法是,可以使用SSS作为起点来添加更复杂的约束,包括递归约束,文档内参照完整性约束等)。
作为参考,以下是使用“schema”模块生成sample.json的SSS的方法:
jq 'include "schema"; schema' source.json > source.schema.json
并针对SSS或ESS验证source.json:
JESS --schema source.schema.json source.json
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.