将过滤器表达式添加到JSONIterator Find函数调用

时间:2018-08-01 19:19:46

标签: json delphi delphi-10.2-tokyo

过滤器表达式使用括​​号表示法查询数组中具有特定属性字符串值的JSON对象的正确语法是什么?

我仅限于括号表示法,因为当过滤器表达式中有引号或撇号时,点表示法在Delphi中不起作用。

  

使用[]访问确实包含引号的对象属性   以他们的名字。例如,使用root ['child.name']或   root [“ child.name”]访问根的child.name属性   对象。

我针对此JSON使用了在线JSON路径评估器,并提出了表达式h1。在在线评估程序中,此路径可以正常工作,并返回我要查找的确切对象。但是,当我在Delphi中运行它时,出现了一个异常

  

EJSONPathException:数组的无效索引:?(@。name =='Training   研讨会-11月9日)

我的问题是,使用括号表示法来查询数组中具有特定属性字符串值的JSON对象的过滤器表达式的正确语法是什么?

作为控制台应用程序的MCVE,包括JSON。

result["elements"][?(@.name == 'Training Seminar - Nov 9')]

1 个答案:

答案 0 :(得分:1)

您根本不能使用表达式,因为它们尚未实现。无论是点表示法还是括号表示法。 System.JSON.TJSONPathParser的官方文档摘录。

  

这些运算符不支持特殊表达式,仅支持   支持实际值(对象属性或数组索引)。

但是在这种情况下,可以用稍微复杂一些的方式来实现。

procedure RunIt;
var
  lJSON, lValue, lName: TJSONValue;
  lFound : Boolean;
begin
  lFound := False;
  lJSON := TJSONObject.ParseJSONValue(JsonStr);
  if Assigned(lJSON) then
  try
    if lJSON.TryGetValue('result.elements', lValue) and (lValue is TJSONArray) then
    begin
      for lValue in TJSONArray(lValue) do
      begin
        lFound := lValue.TryGetValue('name', lName) and (lName.Value = 'Training Seminar - Nov 9');
        if lFound then
          Break;
      end;
    end;
  finally
    lJSON.Free;
  end;
  WriteLn(BoolToStr(lFound));
  ReadLn;
end;