我有一个代表菜单的yaml字符串。在我从它那里得到一个字典之后,我试着获取URL,简单地说是Parameter
的键url
和列表的每个第一个元素,而不是Parameter
这是我试过的
import yaml
import jmespath
import pprint
setting = """
GeneralSetting:
- Description: General Setting
MenuSetting:
- Description: Menu Setting
- Setting:
- AutoMenu:
- Description: Register menu
- HelpText: This is for auto create menu
- Value:
- Sample:
- Parameter:
- icon: fa fa-birthday-cake
- Active: Y
- Sample: [Sample]
- Sample Account: [SampleAccount]
- Multi Journal:
- Parameter:
- icon: fas fa-book
- url: MultiJournal
- Foreign Exchange:
- Parameter:
- icon: fa fa-money-bill-alt
- url: ForeignExchange
- Loan Contract:
- Parameter:
- icon: fa fa-capsules
- Active: Y
- Loan Contract: [LoanContract,1]
- Loan Report:
- Loan Detail Listing: [LoanDetailListing,1]
- Loan Application Detail Listing: [ReportR003,1]
"""
toDict = yaml.load(setting, yaml.SafeLoader)
pp = pprint.PrettyPrinter(indent=2)
# ALL
ALL = jmespath.search('MenuSetting[].Setting[].AutoMenu[].Value[].*[]', toDict)
ParentURL = jmespath.search('MenuSetting[].Setting[].AutoMenu[].Value[].*[0][].Parameter[].url', toDict)
NotParameter = {key:value for item in ALL for it in item for key,value in it.items() if key != "Parameter"}
# pp.pprint(NotParameter)
# print ('-----')
SubURL = jmespath.search('*[0]', NotParameter)
SubSubURL = jmespath.search('*[].*[][]', NotParameter)
pp.pprint(ParentURL)
print('---')
pp.pprint(SubURL)
print('---')
pp.pprint(SubSubURL)
因此,我只能对Parameter
下的url
父URL(如[MultiJournal,ForeignExchange]
)做得很好,但不能对子URL和子URL做得很好
我只想把url的最终结果作为一个列表
[Sample,SampleAccount,MultiJournal,ForeignExchange,LoanContract,LoanDetailListing,Report/R003]
我试了好几种方法,但还是没有得到结果
有没有办法让我得到这样的价值清单?谢谢
尽管我坚信您的YAML结构不是您应该拥有的结构(下面的内容更多),但下面是一个与您的预期输出相匹配的查询:
基于YAML的JSON等价物:
此查询提供:
现在我相信你的YAML有很多问题,你在YAML中混淆了列表和字典
列表将以破折号开头:
字典是一组键/值对,它们都表示父键的属性:
当然,您可以有一个字典列表:
因此,在您的YAML中,如果我将重点放在它的顶部,我相信它应该是沿着以下路线:
当然,这将完全改变和简化查询,例如,基于此YAML,生成的JSON将是:
对第一个元素的查询将是:
这将产生预期的:
相关问题 更多 >
编程相关推荐