Как создать JSON с помощью map в groovy

#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, который необходимо развернуть. Я хочу, чтобы шаблон кодирования был таким, как я написал, чтобы логика генерации скрипта была простой. Итак, было бы полезно, если бы вы указали, допустим ли этот подход?