JMESPath嵌套OR语句

时间:2015-09-16 14:57:59

标签: python json map-function jmespath

我在Python中使用JMESPath来有效地解析大型词典/列表。

我有一个字典列表,对于每个字典我想获得某个值或返回null并将结果放入列表中。即我从每个字典中选择一个字段,但包括一个空值,其中该字段不存在。

例如,我的输入是:

Template.user.helpers({
  "getValueForChecked": function(value){
    var loggedInUser = Meteor.userId();
    var credentials= (Roles.userIsInRole(loggedInUser, [value]));
    return credentials? "checked" : ""
   } ,
   //or alternatively you can use one helper per field
  "isAdmin": function(){
    var loggedInUser = Meteor.userId();
    var admin = (Roles.userIsInRole(loggedInUser, ['admin']));
    return admin ? "checked" : ""
    },
  "isEditor": function(){
     var loggedInUser = Meteor.userId();
     var editor = (Roles.userIsInRole(loggedInUser, ['editor']));
     return editor? "checked" : ""
    }
});

我想要的结果是:

[
    {
        'foo': {'bar': 'yes1'}
    },
    {
        'foo': {'bar': 'yes2'}
    },
    {
        'foo1': {'bar': 'no'}
    }
]

因此,对于列表中的每个字典,我想要路径['yes1', 'yes2', None] ,或者如果路径不存在,我想返回foo.bar。我想要的伪JMESPath表达式是:

None

即。选择所有列表,然后尝试路径foo.bar或返回文字null。 但是括号在语法上是不正确的。如何将OR表达式封装在括号中?我得到的最佳JMESPath表达式是:

[*]( foo.bar||`null` )

前两个术语[*][foo.bar||``][] 将每个元素放入嵌套到列表[*][foo.bar||``]中的列表中,然后[['yes1'], ['yes2'], ['']]将返回的列表展平。然而,这非常令人沮丧并且阻止我返回null,所以我返回一个空字符串。

有人有任何想法吗?我在语法上遗漏了什么吗?

先谢谢。

1 个答案:

答案 0 :(得分:2)

由于JMESPATH 0.9已添加map function。所以现在你可以使用下面的表达式来获得所需的结果:

map(&foo.bar, [*])