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;
...
我正在尝试从 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;
...