模式验证从json的另一个值的总和获取值

时间:2019-08-14 06:32:28

标签: json karate

我的json文件包含下面的数据,我要验证的是amount的值是否为bills[*]. total_electricity_bill + admin_charge的总和。是否有直接在json文件中直接执行此操作的简单方法?

{
    "amount": "68671",
    "admin_charge": "60000",
    "stan": "633105",
    "bills": [
        {
            "produk": "PLNPOSTPAID",
            "total_electricity_bill": "00000008671",
        },
        {
            "produk": "PLNPOSTPAID",
            "total_electricity_bill": "00000000000",
        },
        {
            "produk": "PLNPOSTPAID",
            "total_electricity_bill": "00000000000",
        }
    ],
    "material_number": "",
    "status": true,
    "response_code": "00",
    "rc": "00",
    "trx_id": ""
}

2 个答案:

答案 0 :(得分:1)

也许有一种更优雅的方法,但是以下代码可以工作:

* def resp = 
"""
{
    "amount": "68671",
    "admin_charge": "60000",
    "stan": "633105",
    "bills": [
        {
            "produk": "PLNPOSTPAID",
            "total_electricity_bill": "00000008671",
        },
        {
            "produk": "PLNPOSTPAID",
            "total_electricity_bill": "00000000000",
        },
        {
            "produk": "PLNPOSTPAID",
            "total_electricity_bill": "00000000000",
        }
    ],
    "material_number": "",
    "status": true,
    "response_code": "00",
    "rc": "00",
    "trx_id": ""
}
"""
* def sum = 0    
* def fun = function(x){ var temp = karate.get('sum') + parseFloat(x); karate.set('sum', temp) }
* def fnum = function(x){ return parseFloat(x) }    
* def teb = get resp.bills[*].total_electricity_bill
* eval karate.forEach(teb, fun)
* def ac = get resp.admin_charge
* fun(ac)

* match sum == fnum(resp.amount)

答案 1 :(得分:-1)

不使用空手道,而是使用jq,执行检查相当容易:

<file jq '([.admin_charge,.bills[].total_electricity_bill|tonumber]|add)==(.amount|tonumber)'

jq命令用admin_charge和所有total_electricity字段都转换为数字的形式构建数组,以便检查amount字段。

它返回给定示例的true(如果总和不同,则返回false