在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)
}
}
}
}
}