【问题标题】:Groovy 2 JsonBuilder Nested Iterable AssociationsGroovy 2 JsonBuilder 嵌套的可迭代关联
【发布时间】:2012-10-20 02:27:37
【问题描述】:

我在使用 JsonBuilder 时遇到 2 个问题。我已经通过研究尝试了一切。这是我最接近解决这个问题的方法,但这是不对的。

  1. 日期和议程的数组不具有特色 - 它们以非数组的形式出现。
  2. 出于某种原因,为第 1 天的议程结构提供了第 2 天的议程数据。基础数据正确。

这是建筑物

def root = builder.output {
    days {
        for (Day day : model.days) {
            "$day.name" { 
                agendas {
                    for (Agenda agenda : day.agendas) {
                        "$agenda.name" {
                            name agenda.name
                        }
                    }
                }
            }
        }
    }
}

JSON

{ "output": {
    "days": {
        "Day 1": {
            "agendas": {
                "Day 2 Agenda B": {
                    "name": "Day 2 Agenda A"
                },
                "Day 2 Agenda A": {
                    "name": "Day 2 Agenda A"
                }
            }
        },
        "Day 2": {
            "agendas": {
                "Day 2 Agenda B": {
                    "name": "Day 2 Agenda A"
                },
                "Day 2 Agenda A": {
                    "name": "Day 2 Agenda A"
                }
            }
        }
    }
}}

我追求的是:

{ "output": {
    "days": [
        {
            "name": "Day 1",
            "agendas": [
                {
                    "name": "Day 1 Agenda A"
                },
                {
                    "name": "Day 1 Agenda B"
                }
            ]
        },
        {
            "name": "Day 2",
            "agendas": [
                {
                    "name": "Day 2 Agenda A"
                },
                {
                    "name": "Day 2 Agenda B"
                }
            ]
        }
    ]
}}

【问题讨论】:

    标签: json groovy


    【解决方案1】:

    我终于明白了:)

        def builder = new JsonBuilder()
    
        builder {
            days(days.collect { day ->
                [
                    name: day.name,
                    agendas: day.agendas.collect { agenda ->
                        name: agenda.name   
                    }
                ]
            })
        }
    

    【讨论】:

    • 我认为你可以在没有collect() 的情况下做到这一点。只需使用days(days) { day->。此外,[name:day.name] 这将创建稍后转换为 JSON 的地图。相反,您可以只使用 DSL
    【解决方案2】:

    不用collect()也可以这样:

    builder.days(DAYS) { day->
        name day.name
        agendas(day.agendas){ agenda ->
            name agenda.name
        }
    }
    

    这是输出:

    {
        "days": [
            {
                "name": "Day 1",
                "agendas": [
                    {
                        "name": "Day 1 Agenda A"
                    },
                    {
                        "name": "Day 1 Agenda B"
                    }
                ]
            },
            {
                "name": "Day 2",
                "agendas": [
                    {
                        "name": "Day 2 Agenda A"
                    },
                    {
                        "name": "Day 2 Agenda B"
                    }
                ]
            }
        ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-20
      • 2016-12-27
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多