根据价格设置产品名称,如果价格为零或-1或null,则忽略这些产品

时间:2017-04-06 18:24:39

标签: json rest groovy soapui

大家好,我有大量产品与不同的json对象。我必须根据价格获得产品名称。如果价格不为零或不为null,则获得该产品。

2 个答案:

答案 0 :(得分:1)

这是脚本:

下面的脚本将遍历json并提取有价格的产品名称,并将数据放入名为productPriceMap的地图中,以后可以使用。

def productPriceMap = [:]
def jsonParsed = new groovy.json.JsonSlurper().parseText(json)
jsonParsed.products.collect{ product ->
    product.productRatePlans.collect { ratePlan ->
       ratePlan.productRatePlanCharges.collect { charge ->
           charge.productRatePlanChargeTiers.collect{ tier ->
                if (tier.price) {
                   log.info "${tier.price} - ${product.name}"
                   productPriceMap[product.name] = tier.price
                }
           }
       }
    }
}
log.info "Product and price map\n$productPriceMap"

enter image description here

您可以在线快速尝试 Demo

我相信这可以缩短/更加彻底改变。但这就是我能得到的。

答案 1 :(得分:0)

您正在做的是过滤某个列表。所以它给你一些结果,但必须存储在某个地方才能进一步使用它。

喜欢这个

def toList(priceNullCheck){
    def filteredList = [priceNullCheck].flatten().findAll { it != null}
    log.info filteredList
}

否则您可以直接返回[priceNullCheck].flatten().findAll { it != null}

已更新

import javax.xml.transform.Transformer
import javax.xml.transform.TransformerFactory
import javax.xml.transform.dom.DOMSource
import javax.xml.transform.stream.StreamResult

def groovyUtils  = new com.eviware.soapui.support.GroovyUtils(context)
def response = groovyUtils.getXmlHolder("TestRequest#Response")

def collectResult = []

use (groovy.xml.dom.DOMCategory) {
for( node in response.getDomNodes("//*:products//*:e")) {
    def eachNodeAsXml = groovyUtils.getXmlHolder(nodeToString(node))
    String priceTagValue = eachNodeAsXml.getNodeValue("//*:price")
     float price = priceTagValue?Float.parseFloat(priceTagValue):0
     if(price>0)
        collectResult.add(eachNodeAsXml.getNodeValue("/*:name"))
    }
}

println collectResult

def nodeToString(def node)
{
    StringWriter writer = new StringWriter();
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
    transformer.transform(new DOMSource(node), new StreamResult(writer));
    return writer.toString();
}