将信息从一个JsonBuilder对象添加到另一个JsonBuilder对象

将信息从一个JsonBuilder对象添加到另一个JsonBuilder对象,json,groovy,jsonbuilder,Json,Groovy,Jsonbuilder,正如标题所示,我试图将一个JsonBuilder对象中保存的信息添加到第二个JsonBuilder对象中 目前我有: public String buildOneUser(DyveUserDTO user) { def userBuilder = new JsonBuilder() userBuilder user.collect { usr -> [ 'Name': usr.userName,

正如标题所示,我试图将一个JsonBuilder对象中保存的信息添加到第二个JsonBuilder对象中

目前我有:

public String buildOneUser(DyveUserDTO user)
{
    def userBuilder = new JsonBuilder()
        userBuilder user.collect { usr ->
            [
                    'Name': usr.userName,
                    'Allowance': usr.allowance,
                    'Total Holidays in Calendar': usr.totalHolidaysInCal,
                    'Holidays Booked': usr.numHolidaysBooked,
                    'Holidays Taken': usr.numHolidaysTaken,
                    'Holidays Remaining': usr.totalHolidaysLeft
            ]
        }

    def userHolidayBuilder = new JsonBuilder()
        userHolidayBuilder user.holidayEvents.collect { usr ->
            [
                    'Start Date': usr.startDate,
                    'End Date': usr.endDate,
                    'Days': usr.days
            ]
        }

    def userAndHolidays = userBuilder + userHolidayBuilder

    return userAndHolidays.toPrettyString()
}
user.holidayEvents是表示假日的对象列表,它可以为空,也可以包含任意数量的对象。这让我在做以下事情时犹豫不决:

def userBuilder = new JsonBuilder()
        userBuilder user.collect { usr ->
            [
                    'Name': usr.userName,
                    'Allowance': usr.allowance,
                    'Total Holidays in Calendar': usr.totalHolidaysInCal,
                    'Holidays Booked': usr.numHolidaysBooked,
                    'Holidays Taken': usr.numHolidaysTaken,
                    'Holidays Remaining': usr.totalHolidaysLeft
                    'Holiday': usr.holidayEvents[0].startDate
                    'Holiday': usr.holidayEvents[0].endDate
                    'Holiday': usr.holidayEvents[0].days
            ]
        }
因为我只会得到我写代码的假期数量。如果用户没有假期,并且我告诉它查看usr.holidayEvents[1],因为它不在列表范围内,那么它也会抛出一个异常

我也试过在一个树上筑巢。像这样收集

def userBuilder = new JsonBuilder()
        userBuilder {
           'Name' user.userName,
           'Allowance' user.allowance,
           'Total Holidays in Calendar' user.totalHolidaysInCal,
           'Holidays Booked' user.numHolidaysBooked,
           'Holidays Taken' user.numHolidaysTaken,
           'Holidays Remaining' user.totalHolidaysLeft,
           'Holidays' user.holidayEvents.collect{ evt ->
               [
                  'Start Date': evt.startDate,
                  'End Date': evt.endDate,
                  'Days': evt.days
               ]
            }
        }
但这返回了除假日钥匙以外的所有钥匙

任何帮助都将不胜感激

编辑-我的代码现在如下所示:

public String buildOneUser(DyveUserDTO user)
{
    def userBuilder = new JsonBuilder()
        userBuilder user.collect { usr ->
            [
                    'Name': usr.userName,
                    'Allowance': usr.allowance,
                    'Total Holidays in Calendar': usr.totalHolidaysInCal,
                    'Holidays Booked': usr.numHolidaysBooked,
                    'Holidays Taken': usr.numHolidaysTaken,
                    'Holidays Remaining': usr.totalHolidaysLeft,
                    'Holidays': usr.holidayEvents.collect{ evt ->
                        [
                                'Start Date': evt.startDate,
                                'End Date': evt.endDate,
                                'Days': evt.days
                        ]
                    }
            ]
        }
}
编辑2-示例代码

要调用的方法:

public String buildOneUser(DyveUserDTO user)
{
    def userBuilder = new JsonBuilder()
    userBuilder {
        Name:
        user.userName
        Allowance:
        user.allowance
        TotalHolidaysInCalendar:
        user.totalHolidaysInCal
        HolidaysBooked:
        user.numHolidaysBooked
        HolidaysTaken:
        user.numHolidaysTaken
        HolidaysRemaining:
        user.totalHolidaysLeft
        Holidays:
        user.holidayEvents.collect { evt ->
            [
                    'Start Date': evt.startDate,
                    'End Date'  : evt.endDate,
                    'Days'      : evt.days
            ]
        }
    }

    return userBuilder.toPrettyString()
}
要传入的用户:

class DyveUserDTO
{
    String firstName = "Foo"
    String userName = "FooBar"
    Integer userID = 42
    BigDecimal numHolidaysBooked = 3
    BigDecimal numHolidaysTaken = 0
    BigDecimal totalHolidaysInCal = 3
    BigDecimal totalHolidaysLeft = 12
    BigDecimal allowance = 12
    List<HolidayObject> holidayEvents = []
每个只返回它调用的列表,collect应该用于事件。请参阅下面的工作代码:

import groovy.json.JsonBuilder

class UserEvent {
    def start
    def end
    def days
}

class User {
    def name
    def events
}

def u1 = new User(name: 'u1', events: [new UserEvent(start: 0, end: 1, days: 1), new UserEvent(start: 0, end: 2, days: 2)])
def u2 = new User(name: 'u2', events: [new UserEvent(start: 0, end: 3, days: 3)])

def users = [u1, u2]

def userBuilder = new JsonBuilder()
userBuilder users.collect { usr ->
   [
      'name': usr.name,   
      'events': usr.events.collect { e ->
         [
            start: e.start,
            end: e.end,
            days: e.days,
         ]
       }                   
    ]
}

print  userBuilder.toPrettyString()
编辑

下面是一个工作示例:

import groovy.json.JsonBuilder

user = new DyveUserDTO()

def userBuilder = new JsonBuilder()
    userBuilder {
        Name user.userName
        Allowance user.allowance
        TotalHolidaysInCalendar user.totalHolidaysInCal
        HolidaysBooked user.numHolidaysBooked
        HolidaysTaken user.numHolidaysTaken
        HolidaysRemaining user.totalHolidaysLeft
        Holidays user.holidayEvents.collect { evt ->
            [
                    'Start Date': evt.startDate,
                    'End Date'  : evt.endDate,
                    'Days'      : evt.days
            ]
        }
    }

println userBuilder.toPrettyString()

class DyveUserDTO {
    String firstName = "Foo"
    String userName = "FooBar"
    Integer userID = 42
    BigDecimal numHolidaysBooked = 3
    BigDecimal numHolidaysTaken = 0
    BigDecimal totalHolidaysInCal = 3
    BigDecimal totalHolidaysLeft = 12
    BigDecimal allowance = 12
    List<HolidayObject> holidayEvents = [new HolidayObject(), new HolidayObject()]
}

class HolidayObject {
    public Integer userID = 42
    public String title = "Foo Holiday"
    public String event = "Holiday"
    public String amPm = "Full Day"
    public String name = "Foo"
    public String startDate = '2015-02-20T00:00:00'
    public String endDate = '2015-02-20T00:00:00'
    public BigDecimal days = 1
}

无冒号:需要。请参见示例。另外,我没有Joda依赖项,因此用字符串替换。

在上一个代码示例中,each是错误的,它只返回usr.holidayEvents。您必须使用与第一个示例中相同的collect,而不是collect并返回Mapssory@cfrick,同时提供了我的答案。更改了我使用的最后一段代码。collect但仍然不起作用?@Opal-您的代码确实起作用,但似乎不想与我的代码玩得很好。传入已生成的用户会影响这一点吗?传入已生成的用户-不明白?我已经删除了冒号,但它仍然没有拾取Holidays键。我觉得这可能需要一个新的问题,而不是在这里讨论。我会接受你的答案,因为它确实有效,我已经独立于我的代码对它进行了测试,它只是不适用于我的代码。无论如何谢谢你!
import groovy.json.JsonBuilder

user = new DyveUserDTO()

def userBuilder = new JsonBuilder()
    userBuilder {
        Name user.userName
        Allowance user.allowance
        TotalHolidaysInCalendar user.totalHolidaysInCal
        HolidaysBooked user.numHolidaysBooked
        HolidaysTaken user.numHolidaysTaken
        HolidaysRemaining user.totalHolidaysLeft
        Holidays user.holidayEvents.collect { evt ->
            [
                    'Start Date': evt.startDate,
                    'End Date'  : evt.endDate,
                    'Days'      : evt.days
            ]
        }
    }

println userBuilder.toPrettyString()

class DyveUserDTO {
    String firstName = "Foo"
    String userName = "FooBar"
    Integer userID = 42
    BigDecimal numHolidaysBooked = 3
    BigDecimal numHolidaysTaken = 0
    BigDecimal totalHolidaysInCal = 3
    BigDecimal totalHolidaysLeft = 12
    BigDecimal allowance = 12
    List<HolidayObject> holidayEvents = [new HolidayObject(), new HolidayObject()]
}

class HolidayObject {
    public Integer userID = 42
    public String title = "Foo Holiday"
    public String event = "Holiday"
    public String amPm = "Full Day"
    public String name = "Foo"
    public String startDate = '2015-02-20T00:00:00'
    public String endDate = '2015-02-20T00:00:00'
    public BigDecimal days = 1
}