如何在Groovy中定制JSONBuilder结果?

如何在Groovy中定制JSONBuilder结果?,groovy,Groovy,下面的Groovy代码生成当前结果下显示的结果。如何定制预期输出中所示的JSON输出 当前结果 { "clients": [ { "ID": 1, "NAME": "ABC", "ADDR1": "123 MAIN ST", "ADDR2": "NEW YORK", "ZIP": "12345" }, {

下面的Groovy代码生成当前结果下显示的结果。如何定制预期输出中所示的JSON输出

当前结果

{
    "clients": [
        {
            "ID": 1,
            "NAME": "ABC",
            "ADDR1": "123 MAIN ST",
            "ADDR2": "NEW YORK",
            "ZIP": "12345"
        },
        {
            "ID": 2,
            "NAME": "XYZ",
            "ADDR1": "321 MAIN ST",
            "ADDR2": "NEW JERSEY",
            "ZIP": "98761"
        }
    ]
}
我需要在每一行中循环并自定义吗

预期的

{
    "clients": [
        {
            "ID": 1,
            "NAME": "ABC",
            "CONTACT": {
                "ADDR1": "123 MAIN ST",
                "ADDR2": "NEW YORK",
                "ZIP": "12345"
            }
        },
        {
            "ID": 2,
            "NAME": "XYZ",
            "CONTACT": {
                "ADDR1": "321 MAIN ST",
                "ADDR2": "NEW JERSEY",
                "ZIP": "98761"
            }
        }
    ]
}

下面的代码应该可以工作(但我不确定,因为没有提供完整的示例):


试试看,如果有任何问题请告诉我。你知道它是怎么工作的吗?

它工作得很好。非常感谢。我是Groovy的新手,我知道元编程结构在这里很有用,其中为ID、NAME等键添加了一个动态方法。等等,我不确定我是否正确,但我还没有深入探索这个领域。如果你能简单解释一下它的工作原理,我将不胜感激。不客气。它与元编程无关。这里使用
collect
语句,它将给定的闭包应用于集合的每个元素,并返回修改后的集合。您需要阅读groovy基础知识-集合、闭包。真的很简单,谢谢。我熟悉闭包和groovy迭代器模式。我以为你在问JSONBuilder是如何工作的。我猜JSONBuilder接受任何对象作为输入,并将每个字段或键值转换为JSON元素。这件事我还没有证实,还需要进一步挖掘。哦,很抱歉误解了。是的,这或多或少就是它的工作原理。
{
    "clients": [
        {
            "ID": 1,
            "NAME": "ABC",
            "CONTACT": {
                "ADDR1": "123 MAIN ST",
                "ADDR2": "NEW YORK",
                "ZIP": "12345"
            }
        },
        {
            "ID": 2,
            "NAME": "XYZ",
            "CONTACT": {
                "ADDR1": "321 MAIN ST",
                "ADDR2": "NEW JERSEY",
                "ZIP": "98761"
            }
        }
    ]
}
println new JsonBuilder(clients:resultset.collect {[
   ID: it.ID,
   NAME: it.NAME,
   CONTACT: [
      ADDR1: it.ADDR1,
      ADDR2: it.ADDR2,
      ZIP: it.ZIP,
   ],
]}).toPrettyString()