Erlang - 检查从 JSON 路径检索到的动态变量是否存在

Erlang - checking for existence of dynamic variable retrieved from JSON path

我正在尝试从 JSON 响应中检索属性 'seriesId'。此属性本身可能存在也可能不存在于响应中。

<dyn_variable name="myseriesId" jsonpath="catalog[0].dummy[0].seriesId"/>      

所以,在这里我想根据上述属性的可用性做一些事情。下面是我试过的代码。

<setdynvars sourcetype="eval"
     code="fun({Pid,DynVars})->
            case ts_dynvars:lookup(myseriesId,DynVars) of
                {ok, SeriesId} ->
                      io:format(' seriesId : ~B : ~n',[SeriesId]),
                       BoolSeries = 1;
                 _ ->
                      io:format(' setting bool to zero: ~n'),
                      BoolSeries =0
                 end,
                 BoolSeries
             end.">
         <var name="checkSeries" />
     </setdynvars>

我在这里遇到了一些问题。我在日志中看到了这个。

 ts_search:(4:<0.102.0>) Dyn Var: no Match (varname=myseriesId),
 ts_client:(5:<0.102.0>) Stop in state wait_ack, reason= {badarg,
                                                          [{io,
                                                          format,
                                                          [<0.77.0>,
                                                          ' seriesId : ~B : ~n',
                                                            [<<>>]],
                                                            []},
                                                            {erl_eval,
                                                            .....

JSON 响应没有 'seriesId' 属性,但看起来这段代码仍然遇到 'ok' 情况。我在这里很困惑。 如果 JSON 响应具有 'seriesId' 属性,则此代码有效。

感谢您的帮助!

从日志消息中我们可以看到 ts_dynvars:lookup(myseriesId,DynVars) 的 return 值是 <<>>,即一个空的二进制文件,但您希望它是一个整数(以匹配~B 格式说明符)。

你可以做的一件事是在 case 子句中添加一个保护,以确保只有当值为整数时它才会被选中:

        case ts_dynvars:lookup(myseriesId,DynVars) of
            {ok, SeriesId} when is_integer(SeriesId) ->
                  io:format(' seriesId : ~B : ~n',[SeriesId]),
...

或者你可以为空二进制的case再做一个case子句,单独处理。

        case ts_dynvars:lookup(myseriesId,DynVars) of
            {ok, <<>>} ->
                  io:format(' setting bool to zero: ~n'),
                  BoolSeries = 0;
            {ok, SeriesId} ->
                  io:format(' seriesId : ~B : ~n',[SeriesId]),
                   BoolSeries = 1;
...