2016-02-03 41 views
1

使用jq我想测试下面JSON中特定键值的出现情况,例如“WARNING”已经作为'严重性“的值(即使一次),无论返回的对象的数量如何,我返回一个布尔值。为了简单起见,我有2个对象的下面,但它可能是2000jq - 如何在JSON响应中测试特定值的出现

{ 
    "events": [ 
    { 
     "severity": "WARNING", 
     "status": "", 
     "time_raised": "1454502910919", 
     "data_1": "00000000", 
     "data_2": "00000000", 
     "data_3": "00000000", 
     "register_0": "40000", 
     "register_1": "4", 
     "register_2": "10", 
     "register_3": "0" 
    }, 
    { 
     "severity": "ERROR", 
     "status": "", 
     "time_raised": "1454502840915", 
     "data_1": "00000000", 
     "data_2": "00000000", 
     "data_3": "00000000", 
     "register_0": "50000", 
     "register_1": "4", 
     "register_2": "8", 
     "register_3": "0" 
    } 
    ] 
} 

我的方法是使用“包含”像这样

jq .events[]|.severity|contains("WARNING") 

滤波器,可输出

true 
false 

尝试由于我想要返回一个布尔值,我试图在使用'contains'之前将这些值合并成单个字符串或数组,但是我找不到这样做的方法。

我宁愿保持jq的逻辑,所以我希望我已经错过了树木的木材,并有一个简单的方法,在jq做到这一点。您的方法

回答

2

大厦,你可以,例如,简单的写:

jq '[.events[]|.severity|contains("WARNING")] | any' 

或者更简洁地说:

jq 'any(.events[].severity; contains("WARNING"))' 

如果你想在任何对象来测试的条件下,无论在那里,然后考虑使用walk/1。

+0

我认为OP的例子中引入了“contains”,这是因为试图将所有'.severity'值合并为一个; 'jq'.events |任何(.severity ==“WARNING”)“'应该就足够了。 –

相关问题