Добавление информации из одного объекта JsonBuilder в другой

Как следует из названия, я пытаюсь добавить информацию, содержащуюся в одном объекте 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] поскольку это вне диапазона списка.

Я также пытался вложить .collect как это

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 = []

}

Объекты отдыха, чтобы пойти в holidayEvents:

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 LocalDateTime startDate = LocalDateTime.parse(2015-02-20T00:00:00)
    public LocalDateTime endDate = LocalDateTime.parse(2015-02-20T00:00:00)
    public BigDecimal days = 1
}

class HolidayObject
{
    public Integer userID = 42
    public String title = "Foo Holiday Pm"
    public String event = "Holiday"
    public String amPm = "Pm"
    public String name = "Foo"
    public LocalDateTime startDate = LocalDateTime.parse(2015-02-23T00:00:00)
    public LocalDateTime endDate = LocalDateTime.parse(2015-02-24T00:00:00)
    public BigDecimal days = 2
}

1 ответ

Решение

each просто возвращает список, на который он вызван, collect следует использовать для events, Смотрите рабочий код ниже:

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, поэтому она заменена на String.

Другие вопросы по тегам