在groovy中使用每个函数对解析的json对象进行条件迭代

在groovy中使用每个函数对解析的json对象进行条件迭代,groovy,Groovy,我正在尝试基于.json中的数据创建一个XML。因此,我的.json文件看起来像: { "fruit1": { "name": "apple", "quantity": "three", "taste": "good", "color": { "walmart": "{{red}}","tj": "{{green}}" } }, "fruit2": { "name": "banana", "q

我正在尝试基于
.json
中的数据创建一个XML。因此,我的
.json
文件看起来像:

{
  "fruit1":
    {
      "name": "apple",
      "quantity": "three",
      "taste": "good",
      "color": { "walmart": "{{red}}","tj": "{{green}}" }
    },
  "fruit2":
    {
      "name": "banana",
      "quantity": "five",
      "taste": "okay",
      "color": { "walmart": "{{gmo}}","tj": "{{organic}}" }
    }
}
我可以使用下面的代码从上面的json创建XML

import groovy.xml.*
import groovy.json.JsonSlurper

def GenerateXML() {
  def jsonSlurper = new JsonSlurper();
  def fileReader = new BufferedReader(
                  new FileReader("/home/workspace/sample.json"))
  def parsedData = jsonSlurper.parse(fileReader)
  def writer = new FileWriter("sample.XML")
  def builder = new StreamingMarkupBuilder()
  builder.encoding = 'UTF-8'
  writer << builder.bind {
    mkp.xmlDeclaration()
    "friuts"(version:'$number', application: "FunApp"){
      delegate.deployables {
     parsedData.each { index, obj ->
       "fruit"(name:obj.name, quantity:obj.quantity) {
            delegate.taste(obj.taste)
            delegate.color {
            obj.color.each { name, value ->
              it.entry(key:name, value)
              }
            }
          }
        }
      }
    }
  }

}
我想添加一个
IF
,以便它检查是否有任何类似
'chip*'
的键。如果是,执行另一个迭代。如果不是,只需跳过该部分逻辑,而不抛出任何
错误。像这样

import groovy.xml.*
import groovy.json.JsonSlurper

def GenerateXML() {
  def jsonSlurper = new JsonSlurper();
  def fileReader = new BufferedReader(
                  new FileReader("/home/okram/workspace/objectsRepo/sample.json"))
  def parsedData = jsonSlurper.parse(fileReader)
  def writer = new FileWriter("sample.XML")
  def builder = new StreamingMarkupBuilder()
  builder.encoding = 'UTF-8'
  writer << builder.bind {
    mkp.xmlDeclaration()
    "fruits"(version:'$number', application: "FunApp"){
     deployables {
     parsedData.each { index, obj ->
       "fruit"(name:obj.name, quantity:obj.quantity) {
            taste(obj.taste)
            color {
            obj.color.each { name, value ->
              it.entry(key:name, value)
              }
            }
          }
        }
      }
    }
    if (parsedData.containsKey('chip*')){
      //perform the iteration of the chip* maps
      //to access the corresponding values
      //below code fails, but that is the intent     
      parsedData.<onlyTheOnesPassing>.each { index1, obj1 -> 
         "Chips"(name:obj1.name, quantity:obj1.quantity) {
           type(obj1.type)
         }

      } 

      }

    }
  }
导入groovy.xml* 导入groovy.json.JsonSlurper def GenerateXML(){ def jsonSlurper=新的jsonSlurper(); def fileReader=新的BufferedReader( 新的文件阅读器(“/home/okram/workspace/objectsRepo/sample.json”)) def parsedData=jsonSlurper.parse(文件阅读器) def writer=newfilewriter(“sample.XML”) def builder=new StreamingMarkupBuilder() builder.encoding='UTF-8' 作家 “水果”(名称:对象名称,数量:对象数量){ 味道(对象味道) 颜色{ obj.color.each{name,value-> it.entry(键:名称、值) } } } } } } if(parsedData.containsKey('chip*')){ //执行芯片*映射的迭代 //访问相应的值 //下面的代码失败,但这就是目的 parsedData..每个{index1,obj1-> “芯片”(名称:obj1.name,数量:obj1.quantity){ 类型(obj1.type) } } } } }
我发现了同样的困难,但是在Javascript语言上,如果逻辑对您有所帮助,下面是我所做的:

有两种方法:

您可以使用“get”here:上的库Lodash或另一个“has”:

使用它们,您可以放置对象和路径,并检查是否存在,而不会出现任何错误

示例:

\uu1.has(对象'chip1.name');
//=>错误
_.has(object,'fruit1');
//=>正确
import groovy.xml.*
import groovy.json.JsonSlurper

def GenerateXML() {
  def jsonSlurper = new JsonSlurper();
  def fileReader = new BufferedReader(
                  new FileReader("/home/okram/workspace/objectsRepo/sample.json"))
  def parsedData = jsonSlurper.parse(fileReader)
  def writer = new FileWriter("sample.XML")
  def builder = new StreamingMarkupBuilder()
  builder.encoding = 'UTF-8'
  writer << builder.bind {
    mkp.xmlDeclaration()
    "fruits"(version:'$number', application: "FunApp"){
     deployables {
     parsedData.each { index, obj ->
       "fruit"(name:obj.name, quantity:obj.quantity) {
            taste(obj.taste)
            color {
            obj.color.each { name, value ->
              it.entry(key:name, value)
              }
            }
          }
        }
      }
    }
    if (parsedData.containsKey('chip*')){
      //perform the iteration of the chip* maps
      //to access the corresponding values
      //below code fails, but that is the intent     
      parsedData.<onlyTheOnesPassing>.each { index1, obj1 -> 
         "Chips"(name:obj1.name, quantity:obj1.quantity) {
           type(obj1.type)
         }

      } 

      }

    }
  }