过滤器表达式使用括号表示法查询数组中具有特定属性字符串值的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')]
答案 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;