回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我在一个JSON上迭代以检查是否存在一个键。我故意手动删除了所有没有钥匙的东西</p>
<p>我的示例JSON是:</p>
<pre><code> {
"MODELER": {
"@version": "3",
"MODEL": {
"@BEGINDATE": "1970-01-01 00:00:00.0",
"@DESCRIPTION": "SendPro C 200/300/400 (CSD 2.0) t2019.02.08 u2019.02.12",
"@ENDDATE": "2117-05-03 08:24:36.0",
"@ID": "I_604356",
"@NAME": "SendProCSeries",
"@PATH": "PB.SMB.SendProCSeries",
"@SKU": "",
"@SUBASSEMBLY_TYPE": "MODEL",
"RULE": [
{
"@COMMENT": "",
"@DEFAULTPRIORITY": "50",
"@DESCRIPTION": "Pick Meter Equipment",
"@DISABLEFLG": "N",
"@DefinedOutsideTree": "true",
"@FIRINGPHASE": "",
"@NAME": "PickMeterEquipment",
"BOOLOP": {
"@BOOLOP": "and",
"@SEQ": "0",
"@TYPE": "0",
"BOOLOP": [
{
"@BOOLOP": "or",
"@SEQ": "1",
"@TYPE": "0",
"FRAGMENT": [
{
"@FUNC1": "value",
"@FUNC2": "literal",
"@NULLACTION": "Fragment is false",
"@OP": "=",
"@PROP1": "SALES_TYPE",
"@PROP2": "PURCHASE",
"@SEQ": "1",
"@TYPE": "1"
},
{
"@FUNC1": "value",
"@FUNC2": "literal",
"@NULLACTION": "Fragment is false",
"@OP": "=",
"@PROP1": "SALES_TYPE",
"@PROP2": "LEASE",
"@SEQ": "2",
"@TYPE": "1"
}
]
},
{
"@BOOLOP": "or",
"@SEQ": "2",
"@TYPE": "0",
"FRAGMENT": {
"@FUNC1": "value",
"@FUNC2": "list",
"@NULLACTION": "Fragment is false",
"@OP": "in",
"@PROP1": "PRICELIST",
"@PROP2": "LeaseAccounting",
"@SEQ": "1",
"@TYPE": "1"
}
},
{
"@BOOLOP": "or",
"@SEQ": "4",
"@TYPE": "0",
"FRAGMENT": [
{
"@FUNC1": "value",
"@FUNC2": "propval",
"@NULLACTION": "Fragment is false",
"@OP": "=",
"@PROP1": "PICK_SKU1",
"@PROP2": "._sku",
"@SEQ": "1",
"@TYPE": "1"
},
{
"@FUNC1": "value",
"@FUNC2": "propval",
"@NULLACTION": "Fragment is false",
"@OP": "=",
"@PROP1": "PICK_SKU10",
"@PROP2": "._sku",
"@SEQ": "2",
"@TYPE": "1"
}
]
}
]
},
"ACTION": [
{
"@FORMULA": "1",
"@PROPNAME": "",
"@PROPVALUE": "",
"@SEQ": "0",
"@TYPE": "1",
"LOCALES": null,
"ACTIONITEM": {
"@SEQ": "0",
"@item": ".",
"@max": "1",
"@min": "0",
"@qty": "1"
}
},
{
"@FORMULA": "",
"@PROPNAME": "_isViewable",
"@PROPVALUE": "1",
"@SEQ": "0",
"@TYPE": "2",
"LOCALES": null
}
]
},
{
"@COMMENT": "",
"@DEFAULTPRIORITY": "50",
"@DESCRIPTION": "Pick If External Selected",
"@DISABLEFLG": "N",
"@DefinedOutsideTree": "true",
"@FIRINGPHASE": "",
"@NAME": "PickIfExternalScaleSelected",
"@TRIGGER": "1",
"BOOLOP": {
"@BOOLOP": "and",
"@SEQ": "0",
"@TYPE": "0",
"FRAGMENT": [
{
"@FUNC1": "length",
"@FUNC2": "literal",
"@NULLACTION": "Fragment is false",
"@OP": ">",
"@PROP1": "ExternalScaleVal",
"@PROP2": "0",
"@SEQ": "1",
"@TYPE": "1"
},
{
"@FUNC1": "value",
"@FUNC2": "literal",
"@NULLACTION": "Fragment is false",
"@OP": "=",
"@PROP1": "_amEntitled",
"@PROP2": "1",
"@SEQ": "2",
"@TYPE": "1"
}
]
},
"ACTION": {
"@FORMULA": "1",
"@PROPNAME": "",
"@PROPVALUE": "",
"@SEQ": "0",
"@TYPE": "1",
"LOCALES": null,
"ACTIONITEM": {
"@SEQ": "0",
"@item": ".",
"@max": "1",
"@min": "0",
"@qty": "1"
}
}
},
{
"@COMMENT": "",
"@DEFAULTPRIORITY": "50",
"@NAME": "PickCAAA",
"BOOLOP": {
"@BOOLOP": "and",
"@SEQ": "0",
"@TYPE": "0",
"FRAGMENT": {
"@FUNC1": "value",
"@FUNC2": "literal",
"@NULLACTION": "Fragment is false",
"@OP": "=",
"@PROP1": "_description",
"@PROP2": "Dashboard",
"@SEQ": "1",
"@TYPE": "1"
}
},
"ACTION": {
"@FORMULA": "1",
"@PROPNAME": "",
"@PROPVALUE": "",
"@SEQ": "0",
"@TYPE": "1",
"LOCALES": null,
"ACTIONITEM": {
"@SEQ": "0",
"@item": ".",
"@max": "1",
"@min": "0",
"@qty": "1"
}
}
},
{
"@COMMENT": "",
"@DEFAULTPRIORITY": "50",
"@DESCRIPTION": "Pick ERB4 when ZHD8",
"@DISABLEFLG": "N",
"@FIRINGPHASE": "",
"@NAME": "AUTOSELECT: ERB4",
"@RULECLASSIFICATION": "PICK",
"@TRIGGER": "1",
"BOOLOP": {
"@BOOLOP": "and",
"@SEQ": "0",
"@TYPE": "0",
"FRAGMENT": {
"@FUNC1": "value",
"@FUNC2": "literal",
"@NULLACTION": "Fragment is false",
"@OP": "=",
"@PROP1": "_sku",
"@PROP2": "ZHD8",
"@SEQ": "1",
"@TYPE": "1"
}
},
"ACTION": [
{
"@FORMULA": "1",
"@PROPNAME": "",
"@PROPVALUE": "",
"@SEQ": "0",
"@TYPE": "1",
"LOCALES": null,
"ACTIONITEM": {
"@SEQ": "0",
"@item": ".",
"@max": "1",
"@min": "0",
"@qty": "1"
}
},
{
"@FORMULA": "",
"@PROPNAME": "_isViewable",
"@PROPVALUE": "1",
"@SEQ": "0",
"@TYPE": "2",
"LOCALES": null
}
]
}
]
}
}
}
</code></pre>
<p>现在,我想检查JSON中是否存在特定的子键。为此,我编写了一个函数,它应该基于子键条件打印父键</p>
<p>函数如下所示:</p>
<pre><code>def getTargetPickRules(json_rule_data):
for i in json_rule_data['MODELER']['MODEL']['RULE']:
if 'ACTION' not in i:
continue
if 'ACTIONITEM' not in i['ACTION']:
continue
print("Rule Name - %s %s" % (i['@NAME'],i['ACTION']))
</code></pre>
<p>理想情况下,预期输出应为:</p>
<pre><code>Rule Name - PickMeterEquipment [{'@FORMULA': '1', '@PROPNAME': '', '@PROPVALUE': '', '@SEQ': '0', '@TYPE': '1', 'LOCALES': None, 'ACTIONITEM': {'@SEQ': '0', '@item': '.', '@max': '1', '@min': '0', '@qty': '1'}}, {'@FORMULA': '', '@PROPNAME': '_isViewable', '@PROPVALUE': '1', '@SEQ': '0', '@TYPE': '2', 'LOCALES': None}]
Rule Name - PickIfExternalScaleSelected {'@FORMULA': '1', '@PROPNAME': '', '@PROPVALUE': '', '@SEQ': '0', '@TYPE': '1', 'LOCALES': None, 'ACTIONITEM': {'@SEQ': '0', '@item': '.', '@max': '1', '@min': '0', '@qty': '1'}}
Rule Name - PickCAAA {'@FORMULA': '1', '@PROPNAME': '', '@PROPVALUE': '', '@SEQ': '0', '@TYPE': '1', 'LOCALES': None, 'ACTIONITEM': {'@SEQ': '0', '@item': '.', '@max': '1', '@min': '0', '@qty': '1'}}
Rule Name - AUTOSELECT: ERB4 [{'@FORMULA': '1', '@PROPNAME': '', '@PROPVALUE': '', '@SEQ': '0', '@TYPE': '1', 'LOCALES': None, 'ACTIONITEM': {'@SEQ': '0', '@item': '.', '@max': '1', '@min': '0', '@qty': '1'}}, {'@FORMULA': '', '@PROPNAME': '_isViewable', '@PROPVALUE': '1', '@SEQ': '0', '@TYPE': '2', 'LOCALES': None}]
</code></pre>
<p>如果您看到我的JSON,所有的<code>ACTION</code>键都有<code>ACTIONITEM</code>,但它只输出其中的2个。以下是我的实际输出:</p>
<pre><code>Rule Name - PickIfExternalScaleSelected {'@FORMULA': '1', '@PROPNAME': '', '@PROPVALUE': '', '@SEQ': '0', '@TYPE': '1', 'LOCALES': None, 'ACTIONITEM': {'@SEQ': '0', '@item': '.', '@max': '1', '@min': '0', '@qty': '1'}}
Rule Name - PickCAAA {'@FORMULA': '1', '@PROPNAME': '', '@PROPVALUE': '', '@SEQ': '0', '@TYPE': '1', 'LOCALES': None, 'ACTIONITEM': {'@SEQ': '0', '@item': '.', '@max': '1', '@min': '0', '@qty': '1'}}
</code></pre>