2015-02-20 1 views
0

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

Но это возвратили все ключи, кроме ключа Holidays.

Любая помощь была бы принята с благодарностью!

EDIT - Мой код теперь выглядит следующим образом:

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 
         ] 
        } 
      ] 
     } 
} 

EDIT 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 
} 
+2

в вашем последнем примере кода, каждый из них «неправильный» (он просто возвращает usr.holidayEvents). вам придется использовать тот же 'collect', что и в первом примере (собирать и возвращать карты) – cfrick

+1

Извините @cfrick, предоставили свой ответ одновременно. – Opal

+1

Изменен последний блок кода, я использовал .collect, но он все еще не работает? – Supergoat21

ответ

0

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() 

EDIT

Ниже приведен рабочий пример:

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 
} 

Нет колоны : требуется. См. Образец here. Также у меня нет зависимости от Joda, поэтому она заменяется на String.

+0

Да, я знаю это, спасибо! Это был просто ментальный ярлык :) – Opal

+0

Я удалил двоеточие, но он все еще не набирает ключ «Праздники». Я считаю, что это, вероятно, требует нового вопроса, а не обсуждения его здесь. Я приму свой ответ, поскольку он работает, я проверял его независимо от моего кода, он просто не будет работать с моим кодом. Спасибо, в любом случае! – Supergoat21

+0

Прошу прощения, что проблема окончательно не решена. Благодаря! – Opal