2012-03-09 2 views
2

Я использую Grails 2.1 для рендеринга JSON как части API-интерфейса RestFul, который я создал. Класс домена, на основе таблицы SqlServer, выглядит следующим образом:Вложенный вложенный элемент в сгенерированном JSON в Groovy/Grails

Строка ПгвЬЫате
Строка LastName
Строка officialAddress1
Строка officalAddress2
Строка preferredAddress1
Строка preferredAddress2
(и т.д.). , ,

который возвращает JSON, похожее на это:

{
"FirstName": "Джо",
"LastName": "Холм",
"officialAddress1": "1100 Wob Hill",
"officialAddress2": "Apt. # 3",
"preferredAddress1": "1100 Wobbly Lane.",
"preferredAddress2": "Apartment 3."
}

Он работает нормально, но клиент хочет, чтобы я гнездиться результаты в этой моде:
{
"FirstName": "Джо",
"LastName": "Холм",
preferredAddress {
"preferredAddress1": "1100 Wobbly Lane.",
"preferredAddress1": "Apartment 3."
},
officialAddress {
"officialAddress1": "1100 Wob Hill",
"officialAddress2": "Apt # 3"
}
}

Мой вопрос, так как класс домена, и база данных, не являются структурой, чтобы вернуть этот тип вложенного результата, как я могу легко изменить это в моем возвращенном JSON? Должен ли я отказаться от своего способа просто срывать JSON на основе объекта базы данных/домена и сделать какой-то пользовательский конвертер?

ответ

4

Я новичок в этой вещи stackoverflow, и я надеюсь, что я не испорчу его, но я думаю, что знаю, что вам нужно. в файле bootstrap.groovy вы найдете «DEF INIT = {ServletContext ->» линия положить туда что-то вроде этого:

JSON.registerObjectMarshaller(YourDomainName) { 
def returnArray = [:] 
returnArray['firstName'] = it.firstName 
returnArray['lastName'] = it.lastName 
returnArray['preferredAddress'] = [it.preferredAddress1 ,it.preferredAddress2] 
returnArray['officialAddress'] = [it.officialAddress1 ,it.officialAddress2] 
return returnArray 
} 

теперь, когда вы используете рендер с JSON, как ты Grails будет выглядеть в начальной загрузки и визуализировать домен, как вы просили.

надеюсь, что это поможет

+0

Я только что удалил свой предыдущий комментарий, поскольку он не был на 100% правильным. Это было очень полезно! Я сделал это несколько иначе синтаксически, чтобы получить точные результаты, которые мне нужны, но я обновлю это на этой странице. Еще раз спасибо! – jseals

1

Опубликованный ответ был правильным. Я просто хотел добавить небольшое изменение, которое я сделал, чтобы получить точные результаты, которые мне были нужны:

Спасибо! Так оно и было. Я изначально, что он не будет работать точно так, как мне это нужно, но я был неправ. Я немного изменил синтаксис, чтобы получить нужные мне результаты.

 returnArray['preferredAddress'] = [address1: it.preferredAddress1?.trim(), 
      address2: it.preferredAddress2?.trim(), 
      address3: it.preferredAddress3?.trim(), 
      city: it.preferredCity, 
      state: it.preferredState, 
      postCode: it.preferredPostCode, 
      country: it.preferredCountry 
      ] 
Смежные вопросы