根据条件添加到 JSON ($payload={})

问题描述

我将 JSON 提供给某个 webhook 以触发通知(M$ 团队)。这很好用。但是,我想扩展我的 Perl 脚本:我需要在特定条件下向我的“消息卡”构造添加一个新节点

例如我定义了这个:

public class FoosAsync
{
    public async IAsyncEnumerable<Foo> Source1() { }

    public async IAsyncEnumerable<Foo> Source2() { }

    public async Task<List<Foo>> SequentialSourcesQuery()
    {
        var asyncEnumerator = Source1().GetAsyncEnumerator();
        Func<IAsyncEnumerable<Foo>,Task<List<Foo>>> readValues = async (values) => {
            List<Foo> foos2 = new List<Foo>();
            await foreach (Foo foo in values)
            {
                foos2.Add(foo);
            }        
            return foos2;
        };
        
        Task<List<Foo>> task1 = readValues(Source1());
        Task<List<Foo>> task2 = readValues(Source2());
        
        await Task.WhenAll(task1,task2);
        
        List<Foo> foos = new List<Foo>(task1.Result.Count + task2.Result.Count);
        foos.AddRange(task1.Result);
        foos.AddRange(task2.Result);

        return foos;
    }
}

如果(条件),我想将其扩展如下(顺序很重要):

my $payload={};
$payload = {
    '@type' => 'MessageCard','@context' => 'http://schema.org/extensions',themeColor => $event{COLOR},text => $event{SERVICEOUTPUT},sections => [{
        facts => [{
            name => 'Type',value => "$event{NOTIFICATIONTYPE} $event{ADDITIONALINFO}"
        },]
    }],potentialAction => [{
        '@type' => "OpenUri",name => "View Monitoring",targets => [{
            os => "default",uri => $naemon_url
        }]
    }]
};

$ua = LWP::UserAgent->new;
my $req = POST($opt_webhook,'Content-Type' => 'application/json; charset=UTF-8','Content' => encode_json($payload)
);
my $resp = $ua->request($req);

我不确定如何实现。任何人都可以提供智慧如何解决这个问题吗?

解决方法

您可以推入您在 potentialAction 键中获得的数组引用。为了做到这一点,您需要将它取消引用作为一个数组。

my $payload = {
    '@type' => 'MessageCard',potentialAction => [{
        name => "View Monitoring",targets => [{
            os => "default",}]
    }]
};

if ($maybe) {
    push @{ $payload->{potentialAction} },{
        name => "Notes (Logs,Docs,..)",}]
    };
}

如果您的 Perl 版本是 5.24 或更高版本,您也可以使用 postfix dereferencing,有些人认为它更易于阅读。

push $payload->{potentialAction}->@*,...

有关详细信息,请参阅 perlrefperlreftut