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)
谢谢您的帮助。
根据规则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所说的相反,它应该返回一个联合。