【问题标题】:How to search a JSON hash using a Regex?如何使用正则表达式搜索 JSON 哈希?
【发布时间】:2021-12-31 21:13:43
【问题描述】:

我正在使用 API 将所有宏返回给我,我正在尝试返回所有“宏”,其中“动作”包含与我的正则表达式模式匹配的“值”,我将在下面链接。

我尝试了以下方法和其他方法,但它返回的当前值为零。任何提示表示赞赏

macros["value"].select { |m| m['key'] == 'value' }.first['/^DE([0-9a-zA-Z]\s?){20}$/gm']

API结果sn-p:

   jsObj
=> {"macros"=>
  [{"url"=>"https://s/1900002708354.json",
    "id"=>1900002708354,
    "title"=>"Append Signature",
    "active"=>true,
    "updated_at"=>"2021-10-22T14:11:15Z",
    "created_at"=>"2021-10-22T14:11:15Z",
    "position"=>10001,
    "description"=>"This macro appends a signature to the message ",
    "actions"=>[{"field"=>"comment_value_html", "value"=>"<p>Mit besten Grüßen,</p><p>{{current_user.name}} [{{ticket.account}}]&nbsp; <br></p><p><br></p><p>{{dc.signature_email}}<br></p><p><br></p>"}],
    "restriction"=>nil},
   {"url"=>"949.json",
    "id"=>59071949,
    "title"=>"information",
    "description"=>nil,
    "actions"=>[{"field"=>"priority", "value"=>"low"}, {"field"=>"comment_value", "value"=>"DE89370400440532013000" "DE89 3704

 0044 0532 0130 00"
"}],
        "restriction"=>nil},

期望的结果:

  {
        "macros": [
            {
                "url": "x.json",
                "id": 1900002708354,
                "actions": [
                    {
                        "field": "comment_value_html",
                        "value": "DE89 3704 0044 0532 0130 00"
                    }
                ],
                "restriction": null
            },
 
              {
                "url": "x.json",
                "id": 59071949,
                "actions": [
                    {
                        "field": "priority",
                        "value": "low"
                    },
                    {
                        "field": "comment_value",
                        "value": "DE89 3704 0044 0532 0130 00
"
                    }
                ],
                "restriction": null
            },

【问题讨论】:

  • 无论何时给出示例,请显示所需的结果,此处为有效的 Ruby 对象(例如,数组或哈希)。请注意,"IBANS" 不会出现在 JSON 中(仅"IBAN")。 “宏”是什么意思?
  • @CarySwoveland 感谢您的提示,我已经更新了所需的结果。在这种情况下,一个宏在各种文本模板中,如上面的 API 响应所示,上面我有一个包含 3 个宏的 sn-p。
  • 还是有点不清楚。也许您需要的只是获取macros,其中actions 包含与您的模式匹配的value?见ideone.com/JWT8Xr
  • @WiktorStribiżew 是的,这正是我想要的,我会更新以使其更清晰,谢谢。

标签: json regex ruby


【解决方案1】:

鉴于macros 是包含macros 数据的JSON 对象,您可以使用

macros.select { |m| m["actions"].any? { |w| /\ADE(?:[0-9a-zA-Z]\s?){20}\z/.match?(w["value"]) } }

这是一个 Ruby 演示:

require 'json'

j = <<-DATA
{
    "macros": [
        {
            "url": "x.json",
            "id": 1900002708354,
            "actions": [
                {
                    "field": "comment_value_html",
                    "value": "DE11111111111222222220"
                }
            ],
            "restriction": null
        },
        {
            "url": "x.json",
            "id": 59071949,
            "actions": [
                {
                    "field": "priority",
                    "value": "low"
                },
                {
                    "field": "comment_value",
                    "value": "DE12345678901234567890"
                }
            ],
            "restriction": null
        }
]}
DATA

jsObj = JSON.parse(j)
macros = jsObj['macros']
puts jsObj['macros'].select { |m| m["actions"].any? { |w| /\ADE(?:[0-9a-zA-Z]\s?){20}\z/.match?(w["value"]) } }

输出:

{"url"=>"x.json", "id"=>1900002708354, "actions"=>[{"field"=>"comment_value_html", "value"=>"DE11111111111222222220"}], "restriction"=>nil}
{"url"=>"x.json", "id"=>59071949, "actions"=>[{"field"=>"priority", "value"=>"low"}, {"field"=>"comment_value", "value"=>"DE12345678901234567890"}], "restriction"=>nil}

.select { |m| m["actions"].any? { |w| /\ADE(?:[0-9a-zA-Z]\s?){20}\z/.match?(w["value"]) } } 主要部分获取所有 actions 节点,这些节点包含一个数组,该数组带有一个 value 键,其值与给定的正则表达式匹配。

【讨论】:

  • 感谢您的回答,但是,尽管它与您给定的链接一起使用,但它为我返回了空数组。似乎无法到达 value 键,因为没有 Regexp 返回非空结果。
  • 值被称为 NilClass
  • @cdln 这意味着你没有提供你所拥有的 JSON。
  • 奇怪,我从 Postman 那里拿了打印出来的结果。我用jsobj的值更新了sn-p,应该是准确的。
  • 就是这样。我会尽量让我的问题更简洁+清楚地说明未来的问题,感谢您的帮助。
猜你喜欢
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2019-11-10
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多