我尝试过滤包含值的所有“描述”键的JSON文件;自版本”来打印它们的路径和包含在该值中的版本。我在bash脚本中完成所有这些。
我过滤的JSON来自一个API,在不同的路径上有“description”键。
这是服务器JSON的摘录
到目前为止,我使用curl从服务器获取JSON,并应用以下过滤器将其传输到jq,以获得包含描述中的值的所有路径的列表:
curl$api|jq'路径(对象和(。描述|索引(";自版本")))'
这将返回一个列表,其中包含指向包含搜索值的终结点的路径,如下所示:
[
"paths",
"/v4/user/profileAttributes/{key}",
"delete"
]
[
"paths",
"/v4/users/{user_id}/last_admin_rooms",
"get"
]
[
"definitions",
"GeneralSettings",
"properties",
"s3TagsEnabled"
]
当我找到一对“随机”的字符串时,我会返回一个“不匹配”的值。不幸的是,我不太理解整个过滤器,因为作者没有在他的帖子中解释它。改编时
curl -s -N $api | jq '. as $in
| reduce paths(type == "string" and test("; Since version")) as $path ({};
($in|getpath($path)) as $x
| if ($path[-1]|type) == "string"
then .[$path[-1]] = $x
else .[$path[-2]|tostring] += [$x]
end )'
返回
{
"description": "Some_Text_We_Dont_Care_About; Since version 4.10.2 Some_More_Text_We_Dont_Care_About"
}
如果第二个过滤器返回所有条目,而不是(接缝随机的)一个,我将能够将两个过滤后的响应缝合在一起。我在这里发布了两个过滤器,因为可能有人知道如何以更干净的方式进行。
理想情况下,最终结果将返回一个包含以下条目的列表:
{
"path": "
[
"paths",
"/v4/users/{user_id}/last_admin_rooms",
"get"
]"
",
"version": {
"description": "Some_Text_We_Dont_Care_About; Since version 4.10.2 Some_More_Text_We_Dont_Care_About"
}
}
以下是输入内容的摘录/示例:
{
"info": {4 items},
"host": "some_hostname",
"basePath": "/api",
"tags": [19 items],
"paths": {
"/v4/config/info/defaults": {
"get": {
"tags": [
"config"
],
"summary": "Get default values",
"description": "SomeText; Since version 4.6.0 SomeMoreText",
"operationId": "getSystemDefaultsInfo",
"produces": [
"application/json;charset=UTF-8"
],
}
}
"/v4/config/info/general": {
"get": {
"tags": [
"config"
],
"summary": "Get general values",
"description": "SomeText; Since version 4.6.0 SomeMoreText",
"operationId": "getSystemDefaultsInfo",
"produces": [
"application/json;charset=UTF-8"
],
}
}
"definitions": {
"GeneralSettings": {
"type": "object",
"properties": {
"cryptoEnabled": {
"type": "boolean",
"description": "Activation status of encryption"
},
"s3TagsEnabled": {
"type": "boolean",
"description": "Defines if S3 tags are enabled; Since version 4.9.0 NEW"
},
"sharePasswordSmsEnabled": {
"type": "boolean",
"description": "Allow sending of share passwords via SMS"
}
}
}
}
}
让我为您提供一个替代解决方案-使用基于步行路径的unix实用程序jtc
:
根据所需的输出,使用jtc
查询如下:
bash $ <file.json jtc -w'[description]:<.*; Since version.*>R: [-1] <act>k [-1] <path>k [-1] <pathname>k' -T'{ "path": [ {{pathname}}, {{path}}, {{act}}], "version": { "description": {{$0}}} }'
{
"path": [
"paths",
"/v4/config/info/defaults",
"get"
],
"version": {
"description": "SomeText; Since version 4.6.0 SomeMoreText"
}
}
{
"path": [
"paths",
"/v4/config/info/general",
"get"
],
"version": {
"description": "SomeText; Since version 4.6.0 SomeMoreText"
}
}
{
"path": [
"GeneralSettings",
"properties",
"s3TagsEnabled"
],
"version": {
"description": "Defines if S3 tags are enabled; Since version 4.9.0 NEW"
}
}
bash $
假设你的Json是不规则的(w.r.t walkingdescription
requirement),但不确定你是否需要查看最后一个对象。如果您不需要它,那么知道JSON的结构,就可以很容易地增强查询,以排除像上一个一样的假阳性匹配。
编辑:解释:
-T
选项提供了一个Json模板,其中模板项(用双大括号括起来){..}
-w
)从名称空间中插入。
现在步行路径(-w
)是步行源代码JSON的方式:jtc
让Json自由地上下行走(使用下标[...]
)并执行递归搜索
让我把它分解在这里(顺便说一句,所有的词都在链接中描述):
[description]:
你可以轻松地使用查询(删除每个词素或添加你的词素,看看步行是如何工作的)——我编辑了词素路径,用空格分隔每个词素。
PS
问题内容: 我是用python开发东西的C编码器。我知道如何在C语言中执行以下操作(以及因此在应用于Python的类似C的逻辑中),但是我想知道这样做的“ Python”方式是什么。 我有一个字典d,我想对项的子集进行操作,只有那些键(字符串)的项包含特定的子字符串。 即C逻辑将是: 我在想python版本会像 我在这里找到了很多有关过滤字典的文章,但是找不到与之相关的文章。 我的字典未嵌套,我正
问题内容: 是否可以使用Laravel擦除Redis中与特定字符串匹配的所有键?例如,如果我想忘记包含单词product的键,它将忘记以下键: laravel:896235872385237588327582370375acaca235325:产品列表laravel:896235872385237588327582370375acaca235325:产品类别 我会在redis服务器上运行它,但是我
如何消除罗恩说了一句我不想说的话?我有这个数据框: 我正试图删除带有“esponja”字样的rown 我想要这样的数据帧: 我是新手,我不知道如何解决这个问题
我有一个收藏:
想知道什么在什么不在吗?Puppet 的 in 可以帮你, 如下面的表达式: if "foo" in $bar 如果 foo 是 $bar 的子串,表达式的值为 true。 如果 $bar 是个数组,并且 foo 是这个数组中的一个元素,表达式的值为 true。 如果 $bar 是一个哈希,foo 是 $bar 的一个键值,表达式的值为 true。 操作步骤 在你的配置清单中添加如下代码: if
本文向大家介绍找出包含Python中特定字符串的最小子字符串的程序,包括了找出包含Python中特定字符串的最小子字符串的程序的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个字符串s和t。我们必须找到s中最小的子字符串,其中t也是子字符串的子序列。如果该类型的子字符串不存在,我们将返回一个空白字符串,如果有多个最小的子字符串,我们将选择最左边的一个。 因此,如果输入类似于s =“ abcb