2015-12-02 2 views
0

Я пытаюсь вернуть атрибут 'seriesId' из ответа JSON. Этот атрибут сам может или не может существовать в ответе.Erlang - проверка наличия динамической переменной, полученной из пути JSON

<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».

Спасибо за помощь!

ответ

2

Из сообщения журнала мы можем видеть, что возвращаемое значение ts_dynvars:lookup(myseriesId,DynVars) является <<>>, т.е. пустой двоичный, но вы ожидаете, что это целое число (в соответствии с форматом ~B спецификатор).

Одна вещь, которую вы могли бы сделать, это добавить охранника к статье случай, чтобы убедиться, что он только получает выбирается, если значение является целым числом:

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

Или вы могли бы сделать еще один пункт случай для случая пустой двоичный файл, и обрабатывать его отдельно.

 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; 
... 
+0

спасибо !! '2417- fatal: surprise_char Ошибка конфигурации, прерывание! {fatal, {surprise_char, '- {ok, <<>>} -> кажется, вызывает проблемы для меня. Вы можете помочь? –

+1

Правильно, так как код Erlang вставлен в файл XML, вам нужно избежать символов '<' and '>'. Вместо '{ok, <<>>}', напишите '{ok, < < > >}'. – legoscia

Смежные вопросы