#groovy
#groovy
Вопрос:
В groovy как я могу создать выходной json в приведенной ниже структуре, используя приведенные ниже входные данные. Я сделал это на Java, но я не понимаю, как я могу это сделать в groovy.
ВВОД:
{
"name": "app",
"test2": [
{
"status": [
{
"id": 1,
"pole": [
{
"Color": "RED",
"Status": 0
},
{
"Color": "AMBER",
"Status": 0
},
{
"Color": "GREEN",
"Status": 0
}
]
},
{
"id": 2,
"pole": [
{
"Color": "RED",
"Status": 0
},
{
"Color": "AMBER",
"Status": 0
},
{
"Color": "GREEN",
"Status": 0
}
]
}
]
},
{
"status": [
{
"id": 1,
"pole": [
{
"Color": "RED",
"Status": 0
},
{
"Color": "AMBER",
"Status": 0
},
{
"Color": "GREEN",
"Status": 0
}
]
},
{
"id": 2,
"pole": [
{
"Color": "RED",
"Status": 0
},
{
"Color": "AMBER",
"Status": 0
},
{
"Color": "GREEN",
"Status": 0
}
]
}
]
}
]
}
Вывод1:
Должен быть создан вывод «один ко многим», где путем итерации необходимо создать множество выходных данных приведенной ниже структуры.Как и в приведенном ниже выводе, он должен создать 12 объектов JSON.
{
"OUTPUT": {
"STATUS": {
"id": "1",
"color": "RED"
}
}
}
Вывод2:
{
"OUTPUT": {
"STATUS": [{
"id": "1",
"color": "RED"
},{
"id": "1",
"color": "AMBER"
}
.
.
{
"id": "2",
"color": "RED"
}
]
}
}
Поскольку я новичок в groovy, я не совсем понимаю, как я могу это сделать.
Ниже приведен код, который я пробовал до сих пор.
import groovy.json.*;
def data='''{"name": "app","test2": [{"status": [{"id": 1,"pole": [{"Color": "RED","Status": 0},{"Color": "AMBER","Status": 0},{"Color": "GREEN","Status": 0}]},{"id": 2,"pole": [{"Color": "RED","Status": 0},{"Color": "AMBER","Status": 0},{"Color": "GREEN","Status": 0}]}]},{"status": [{"id": 1,"pole": [{"Color": "RED","Status": 0},{"Color": "AMBER","Status": 0},{"Color": "GREEN","Status": 0}]},{"id": 2,"pole": [{"Color": "RED","Status": 0},{"Color": "AMBER","Status": 0},{"Color": "GREEN","Status": 0}]}]}]}'''
def data1 = new JsonSlurper().parseText( data );
def a=[:]
def OU=[:]
def status=[]
a.OUTPUT=OU
OU.STATUS=status
for(def i=0;i<data1.test2.size();i ){
for(def j=0;j<data1.test2[i].status.size();j ){
def b=[:]
b.id=data1.test2[i].status[j].id
for(def k=0;k<data1.test2[i].status[j].pole.size();k ){
b.color=data1.test2[i].status[j].pole[k].Color
status<<b
}
}
}
String finalJson = JsonOutput.toJson a;
println finalJson
Это правильный способ формирования json (с использованием map) как я обнаружил, помимо JsonBuilder, Map — это еще один способ создания JSON. Ранее я использовал org.json для создания скрипта динамической нормализации json, поэтому, если приведенный выше метод, который я использовал, верен, я могу приступить к генерации динамической нормализации данных из JSON-JSON с помощью скрипта groovy из кода Java.
Комментарии:
1. Неясно (для меня), каким должен быть ожидаемый результат. У вас есть два набора желаемых выходных данных?
2. Я обновил вопрос, и мой код работает, можете ли вы проверить, это правильный способ создания JSON, поскольку я новичок в groovy. Я создаю нормализацию JSON с помощью groovy script, но это динамически генерируется с помощью сопоставления ввода и вывода JSON, и я создаю groovyscript с использованием JAVA и загружаю его в движок. Итак, если приведенный выше подход верен, я продолжу, потому что в приведенном выше подходе будет легко сгенерировать скрипт, но если я использую JsonBuilder и использую closure, тогда его может стать сложно сгенерировать. ИТАК, мне просто нужен ваш вклад здесь.
Ответ №1:
Не 100%, как должен выглядеть результат, а сценарий
import groovy.json.*
def data='''{"name": "app","test2": [{"status": [{"id": 1,"pole": [{"Color": "RED","Status": 0},{"Color": "AMBER","Status": 0},{"Color": "GREEN","Status": 0}]},{"id": 2,"pole": [{"Color": "RED","Status": 0},{"Color": "AMBER","Status": 0},{"Color": "GREEN","Status": 0}]}]},{"status": [{"id": 1,"pole": [{"Color": "RED","Status": 0},{"Color": "AMBER","Status": 0},{"Color": "GREEN","Status": 0}]},{"id": 2,"pole": [{"Color": "RED","Status": 0},{"Color": "AMBER","Status": 0},{"Color": "GREEN","Status": 0}]}]}]}'''
def data1 = new JsonSlurper().parseText data
def output = [ OUTPUT:[
STATUS:data1.test2.status.inject( [] ){ res, curr ->
curr.each{ stat ->
stat.pole.each{
res << [ id:stat.id, color:it.Color ]
}
}
res
}
] ]
println JsonOutput.prettyPrint( JsonOutput.toJson( output ) )
выдает следующий вывод:
{
"OUTPUT": {
"STATUS": [
{
"id": 1,
"color": "RED"
},
{
"id": 1,
"color": "AMBER"
},
{
"id": 1,
"color": "GREEN"
},
{
"id": 2,
"color": "RED"
},
{
"id": 2,
"color": "AMBER"
},
{
"id": 2,
"color": "GREEN"
},
{
"id": 1,
"color": "RED"
},
{
"id": 1,
"color": "AMBER"
},
{
"id": 1,
"color": "GREEN"
},
{
"id": 2,
"color": "RED"
},
{
"id": 2,
"color": "AMBER"
},
{
"id": 2,
"color": "GREEN"
}
]
}
}
Комментарии:
1.Я обновил вопрос, и мой код работает, можете ли вы проверить, это правильный способ создания JSON, поскольку я новичок в groovy. Я создаю нормализацию JSON с помощью groovy script, но это динамически генерируется с помощью сопоставления ввода и вывода JSON, и я создаю groovyscript с использованием JAVA и загружаю его в движок. Итак, если приведенный выше подход верен, я продолжу, потому что в приведенном выше подходе будет легко сгенерировать скрипт, но если я использую JsonBuilder и использую closure, тогда его может стать сложно сгенерировать. ИТАК, мне просто нужен ваш вклад здесь.
2. да, спасибо, но поскольку я генерирую скрипт динамически, используя JAVA, который необходимо развернуть. Я хочу, чтобы шаблон кодирования был таким, как я написал, чтобы логика генерации скрипта была простой. Итак, было бы полезно, если бы вы указали, допустим ли этот подход?