当前位置: 首页 > 知识库问答 >
问题:

需要过滤值包含特定子字符串的所有键/值对

厉念
2023-03-14

我尝试过滤包含值的所有“描述”键的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"
        }
      }
    }
  }
}

共有1个答案

汪和悌
2023-03-14

让我为您提供一个替代解决方案-使用基于步行路径的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 walkingdescriptionrequirement),但不确定你是否需要查看最后一个对象。如果您不需要它,那么知道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