在 jsonpath-ng python 中使用 OR 运算符 (|)

Ted*_*ann 5 python json operators jsonpath

我有一个 json 结构 (client_json),如下所示:

client_json = { "data": [ { "attributes": { "creators": [ { "name": "This is a person", "nameType": "Personal", "givenName": "the", "familyName": "person" }, { "name": "This is an organization", "nameType": "Organizational", "givenName": "the", "familyName": "organization" } ] } } ] }
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用 jsonpath-ng 1.4.3 ( https://github.com/h2non/jsonpath-ng ) 来检索创建者名称。

from jsonpath_ng import jsonpath
from jsonpath_ng.ext import parse
Run Code Online (Sandbox Code Playgroud)

这两个表达式给出了预期的结果:

[match.value['name'] for match in parse("data[*].attributes.creators[?(@.nameType='Personal')]").find(client_json)]
[match.value['name'] for match in parse("data[*].attributes.creators[?(@.nameType='Organizational')]").find(client_json)]
Run Code Online (Sandbox Code Playgroud)

我试图将它们与 or 运算符结合起来,所有这些表达式都会产生解析错误:

parse("data[*].attributes.creators[?(@.nameType == 'Organizational' | @.nameType == 'Personal')]")
parse("data[*].attributes.creators[?(@.nameType == 'Organizational' || @.nameType == 'Personal')]")
parse("data[*].attributes.creators[?(@.nameType == 'Organizational'), ?(@.nameType == 'Personal')]")
parse("data[*].attributes.creators[?(@.nameType == 'Organizational') || ?(@.nameType == 'Personal')]")
parse("data[*].attributes.creators[?(@.nameType == 'Organizational') | ?(@.nameType == 'Personal')]")
parse("data[*].attributes.creators[?(@.nameType = 'Organizational' | @.nameType = 'Personal')]")
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助。

han*_*frc 0

根据规则jsonpath1 | jsonpath2,这个没有错误:

[match.value['name'] for match in     
parse("data[*].attributes.creators[?(@.nameType == 'Organizational')] | data[*].attributes.creators[?(@.nameType == 'Personal')]").find(client_json)]
Run Code Online (Sandbox Code Playgroud)

但是仅返回两者中的第二个名字,即

['This is a person']
Run Code Online (Sandbox Code Playgroud)

与https://github.com/h2non/jsonpath-ng所说的相反,它应该返回一个联合。